JavaDoc для BufferedReader.readLine а>:
Возвращает: Строка, содержащая содержимое строки, не включая никаких символов завершения строки, или нуль, если достигнут конец потока.
Исходя из этого, я не думаю, что он когда-либо вернет null (может ли System.in быть закрыт, я не думаю, что он когда-либо возвращает конец потока?), поэтому цикл while не завершится. Обычный способ остановить поток — либо использовать логическую переменную в условии цикла и изменить ее вне потока, либо вызвать метод interrupt() объекта Thread (работает, только если поток ждет():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, если он заблокирован в строке чтения, или, по крайней мере, я не смог его найти (используя System.in).
person
esaj
schedule
15.05.2011
readLine
вMyThread
подниматьSocketException
с"Socket closed"
. Таким образом, я могу прерватьMyThread
. - person pts   schedule 15.05.2011