JavaDoc для BufferedReader.readLine :
Возвраты: строка, содержащая содержимое строки, не включая символы окончания строки, или ноль, если конецдостигнут поток
Исходя из этого, я не думаю, что он когда-либо вернет ноль (может ли System.in быть фактически закрытым, я не думаю, что он когда-либо вернет конец потока?), так что цикл while не завершится.Обычный способ остановить поток - либо использовать булеву переменную в условии цикла и изменить ее извне потока, либо вызвать метод interrupt () -объекта объекта Thread (работает только в том случае, если поток является wait (): ing илиsleep (): ing или в методе блокировки, который генерирует исключение InterruptedException).Вы также можете проверить, был ли поток прерван с помощью isInterrupted () .
Редактировать: Вот простая реализация, использующая isInterrupted()
и interrupt()
.Основной поток ждет 5 секунд, прежде чем прерывать рабочий поток.В этом случае рабочий поток в основном занят ожиданием, так что это не так уж хорошо (все время цикл и проверка stdin.ready()
, вы, конечно, можете оставить рабочий поток на некоторое время в спящем режиме, если вход не готов):
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class MyThreadTest
{
public static void main(String[] args)
{
MyThread myThread = new MyThread();
myThread.start();
try
{
Thread.sleep(5000);
}
catch(InterruptedException e)
{
//Do nothing
}
myThread.interrupt();
}
private static class MyThread extends Thread
{
@Override
public void run()
{
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
String msg;
while(!isInterrupted())
{
try
{
if(stdin.ready())
{
msg = stdin.readLine();
System.out.println("Got: " + msg);
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
System.out.println("Aborted.");
}
}
}
Кажется, что нет способа фактически прервать BufferedReader, если он заблокирован на readline, или, по крайней мере, я не смог его найти (используя System.in).