Есть одна нить ждущая консольный ввод, другая пытается ее завершить и не может.
Вопрос:
существует ли способ заставить завершиться вызов 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.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 >>
Здравствуйте, dshe, Вы писали:
D>Попробуй Thread.interrupt(). BufferedReader.readLine() должен тогда будет бросить java.io.InterruptedIOException
не работает, для того чтобы здесь срабатывал interrupted, поток должен реализовывать интерфейс InterruptibleChannel