как бы мне прервать консольный ввод ???
От: Илья К.  
Дата: 16.03.04 15:05
Оценка:
Есть одна нить ждущая консольный ввод, другая пытается ее завершить и не может.

Вопрос:
существует ли способ заставить завершиться вызов in.readLine() из другой нити ?

так получаем in:

  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));


нить 1: читает что-то из потока System.in

  public void run()
  {
    for(;;)
    {
       //...

       String cmd = in.readLine(); // здесь блокируется до нажатия [Enter]

       //...
    }
  }


нить 2: пытается завершить нить 1

   in.close(); // виснет здесь до завершения функции in.readLine (для потоков не System.in в первой нити вылетает IOException)
Re: как бы мне прервать консольный ввод ???
От: Lucker Беларусь http://lucker.intervelopers.com/
Дата: 16.03.04 15:19
Оценка:
Здравствуйте, Илья К., Вы писали:

ИК>Есть одна нить ждущая консольный ввод, другая пытается ее завершить и не может.


ИК>Вопрос:

ИК> существует ли способ заставить завершиться вызов in.readLine() из другой нити ?

ИК>так получаем in:

ИК>

ИК>  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

ИК>


ИК>нить 1: читает что-то из потока System.in

ИК>

ИК>  public void run()
ИК>  {
ИК>    for(;;)
ИК>    {
ИК>       //...

ИК>       String cmd = in.readLine(); // здесь блокируется до нажатия [Enter]

ИК>       //...
ИК>    }
ИК>  }
   
ИК>


ИК>нить 2: пытается завершить нить 1

ИК>

ИК>   in.close(); // виснет здесь до завершения функции in.readLine (для потоков не System.in в первой нити вылетает IOException)

ИК>

если in — из сокета — @see java.nio

если нет — нет. (Видел единственную реализацию nonblocked file IO с использование treads)
... << RSDN@Home 1.1.3 stable >>
Re: как бы мне прервать консольный ввод ???
От: dshe  
Дата: 16.03.04 16:23
Оценка:
Здравствуйте, Илья К., Вы писали:

ИК>Есть одна нить ждущая консольный ввод, другая пытается ее завершить и не может.


ИК>Вопрос:

ИК> существует ли способ заставить завершиться вызов in.readLine() из другой нити ?

Попробуй Thread.interrupt(). BufferedReader.readLine() должен тогда будет бросить java.io.InterruptedIOException
--
Дмитро
Re[2]: как бы мне прервать консольный ввод ???
От: Илья К.  
Дата: 16.03.04 16:45
Оценка:
Здравствуйте, dshe, Вы писали:

D>Попробуй Thread.interrupt(). BufferedReader.readLine() должен тогда будет бросить java.io.InterruptedIOException

не работает, для того чтобы здесь срабатывал interrupted, поток должен реализовывать интерфейс InterruptibleChannel
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.