2012-01-25 2 views
1
public class InterruptedInput { 

    public static void main(String[] args) { 
     InputThread th=new InputThread(); //worker thread instantiated. 
     th.start(); //worker thread start. 
     try{ 
      Thread.sleep(5000); //main thread sleep for 5 sec. 
     }catch(InterruptedException ex){} 
     th.interrupt(); //worker thread interrupted. 
    } 
} 

class InputThread extends Thread{ 
    int sum; 
    BufferedReader br; 
    public void run(){ 
     br=new BufferedReader(new InputStreamReader(System.in)); 
     try{ 
      sum(); 
      sleep(10000); //worker thread sleep for 10 sec. 
     }catch(Exception ex){ 
      System.out.println("sum="+sum); 
     } 
    } 

    public void sum(){ 
     try{ 
      while(!isInterrupted()){ 
       sum+=Integer.parseInt(br.readLine()); 
      } 
     }catch(Exception ex){} 
    } 
} 

В этой программе, рабочий поток ждет ввода пользователя (который будет целое значением) и не подвести итог до основного потокаinterrut() он.
Но когда Основная нитьinterrupt()worker thread его ввод/вывод для ввода пользователем и не прерывание.Прерывание потока ожидает ввод данных пользователя

Выходной сигнал, который я хочу придумать с помощью этой программы:
Когда программа выполнена, пользователю необходимо ввести целочисленные значения и через пять секунд. сумма входных значений печатается либо пользователем, который все еще вводит значения, либо ждет 5 секунд. Результат будет напечатан сразу после 5 сек.

+1

Я считаю, что ваша проблема заключается в том, что команда br.readLine() выполнит до того, как логическое значение для цикла будет переоценено. Это означает, что вам нужно будет ввести 1 номер после истечения цикла – jozefg

+0

@jozefg: вы правы. У вас есть решение? –

ответ

1

ОК, поэтому проблема с этим кодом заключается в том, что оператор br.readLine() должен быть выполнен до проверки условия цикла. Поэтому, чтобы этого избежать, у меня было бы 3 потока потенциально.

Тема 1:

Это будет основной или родительский поток. В этой теме вы просто сосчитать до 5, а затем прервать нить 2.

резьбы 2:

В этой теме вы будете контролировать статическую переменную: count, а затем распечатать его и прервать нить 3, когда прерывается.

Тема 3:

Вот вы были бы получить ввод и и передать вход в функцию, которая бы добавить его в count. Когда прерванные ничего не делают.

Если у вас есть какие-либо вопросы, дайте мне знать.

1

Поскольку IO не является прерывает вы можете @Override в InputThread, чтобы закрыть входной поток

@Override 
public void interrupt(){ 
    try{ 
     this.br.close(); 
    }finally{ 
     super.interrupt(); 
    } 
} 
+0

Выход не такой, как предполагалось. Проверьте приведенный выше код. –

+0

Вы не должны ловить и проглатывать IOException в методе sum(). Удалите эту попытку/catch и предложите исключение inline с помощью объявления метода. –

+0

@John Vint: Я следовал той же интуиции, что и вы в моем (теперь удаленном) ответе, который должен был асинхронно закрыть BufferedReader из основного потока и вызвать IOException, но по какой-то причине он, похоже, не работает. Вызов br.close() блокируется бесконечно. – Tudor

0

Альтернатива была бы позволить счетчик для печати в любое время. Добавьте следующий к InputThread Класс:

private AtomicInt count; 

public int getCount() { 
    return count; 
} 

И иметь основной метод печати графа:

System.out.println("Sum:" + th.getCount()); 

Это позволило бы избежать каких-либо необходимости interupting темы.

+0

извините! но мне нужно, чтобы он использовал 'interrupt()' –

Смежные вопросы