我有一个执行以下代码的线程:
public void run() {
try {
int n = 0;
byte[] buffer = new byte[4096];
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
out.flush();
}
} catch (IOException e) {
System.out.println(e);
}
}
其中in
是System.in
。我怎样才能优雅地停止这样的线程?关闭System.in
和使用Thread.interrupt
似乎都不起作用。
发布于 2010-11-15 16:14:52
这是因为读取System.in (InputStream)是一个阻塞操作。
看这里,Is it possible to read from a InputStream with a timeout?
发布于 2010-11-15 17:10:40
你偶然发现了一个9岁的bug,没有人愿意修理它。他们说在this bug report中有一些变通方法。很可能,您需要找到其他方法来设置超时(忙碌等待似乎是不可避免的)。
发布于 2010-11-15 16:27:10
您可以使用available()方法(它是非阻塞的)来检查是否有要预先读取的内容。
在伪java中:
//...
while(running)
{
if(in.available() > 0)
{
n = in.read(buffer);
//do stuff with the buffer
}
else
{
Thread.sleep(500);
}
}
//when running set to false exit gracefully here...
https://stackoverflow.com/questions/4182491
复制相似问题