如果我有这样的话:
Thread t = new Thread(myThread);
t.start();
private static Runnable myThread = new Runnable() {
public void run() {
try{
String line=null;
while ((line = eStream.readLine()) != null){
//do something
}
}
catch (Exception e){}
}
};
现在在while循环中会发生什么,有时readLine()
被挂起,因为它期望来自外部进程的输入。所以在这种情况下,我要做的是设置一个计时器,如果它到期,我interrupt this thread t
与t.interrupt();
现在,当我尝试在try块之后捕获InterruptedException
时,我收到编译时错误。在这种情况下有人能告诉我,我怎样才能捕获中断异常?
谢谢
答案 0 :(得分:2)
中断不会释放阻塞的readLine()调用。你必须关闭流才能做到这一点。
您正在使用此行
捕获InterruptedException(并忽略它)catch (Exception e){}
这不起作用
line = eStream.readLine().toString()
因为当你到达文件末尾时会抛出NullPointerException。删除.toString()
答案 1 :(得分:2)
来自InterruptedException的文档:
当线程正在等待,休眠或以其他方式暂停时,抛出该异常 很长时间和另一个线程使用中断方法中断它 在Thread类中。
我怀疑你感兴趣的是InterruptedIOException:
表示I / O操作已中断。一个 抛出InterruptedIOException以指示输入或输出 传输已被终止,因为执行它的线程是 中断。
我会查看this JavaSpecialists newsletter干净利落的gdown线程,特别是在IO上阻止的线程怎么样?,它详细介绍了这个区域。