2013-12-12 4 views
3

Я работаю над приложением (консолью), которое содержит цикл while, который я хотел бы разрешить пользователю приостанавливать и возобновлять. После некоторого исследования выясняется, что дополнительный поток, заданный с ожиданием ввода пользователя, является правильным решением.Обработка ввода нескольких потоков

Я смог реализовать дополнительный поток, который постоянно ждет ввода, а также имеет метод kill, который устанавливает переменную флага, чтобы остановить потоки while(). К сожалению, поскольку цикл while не заканчивается, если нет ввода, этот флаг kill будет вступать в силу только после того, как цикл while входного потока завершится хотя бы один раз. Так как основной поток также ожидает ввода в конце своего собственного цикла, вход пользователя берется входным потоком, заставляя сканер основного потока пропускать вход, если не ввести дважды. Есть ли способ немедленно отключить цикл while() входного потока, не выполняя одну итерацию? Может потребоваться какая-то функция тайм-аута? Я отправил соответствующий код ниже:

InputReader Runnable код новой Тема:

public class ReadInput implements Runnable 
{ 
    private static volatile boolean running = true; 
    Scanner user_input = new Scanner(System.in); 

    public void run() 
    { 
     while(running) 
     { 
      System.out.println("ReadingInput Input Value: " + user_input.nextLine()); 
     } 
    } 

    public void kill() 
    { 
     running = false; 
     System.out.println("Thread Killed."); 
    } 
} 

Основной код Тема:

//Start reader thread in order to scan for input without stopping main code 
ReadInput reader = new ReadInput(); 
Thread reader_thread = new Thread(reader); 
reader_thread.start(); 

while(code_available_for_processing) 
{ 
    //Main Thread while() loop processing 
} 

//STOP Input Reader Thread before main thread requests input 
reader.kill(); 

//Request user input for program re-run 
+0

Первое - вам нужно убить его вообще до завершения приложения? Если да, вы можете попробовать закрыть stdin? Никогда не пробовал, не знаю, что произойдет. Возможно, он будет вбрасывать поток или просто возвращаться без ввода - любой из них будет в порядке и позволит вам проверить текущий флаг. Может быть стоит попробовать :) –

+0

Вы должны прочитать неблокирующая из стандартного ввода http://stackoverflow.com/questions/2249680/concurrent-non-blocking-console-keyboard-input-in-java – abasterfield

ответ

1

Используйте прерывание объектов Thread класса. Это может привести к тому, что поток, который заблокирован, ожидает ввода для ввода InterruptedIOException. См. elsewhere для получения дополнительной информации.

+0

Звучит хорошо. Никогда не пробовал это на stdin либо :) –

+0

Я пробовал это, вызвав reader_thread.interrupt() в основном потоке, а затем добавив захват InterruptedException в поток ReadInput. Проблема в том, что он по-прежнему остается в заблокированном режиме, ожидая ввода. – George

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