2012-01-12 73 views
1

,如果我有一个线程是这样的:中断线程在Java中的上吊过程

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 tt.interrupt();

现在,当我尝试try块后赶上InterruptedException,我得到编译时错误。在这种情况下,有人能告诉我,我怎么能捕获中断异常?

谢谢

+1

你能显示导致编译时错误的代码吗? – marchaos 2012-01-12 15:37:26

+0

@marchaos实际上错误消息表示InterruptedException的Unreachable catch块。这个异常不会从try语句体中抛出。所以我很困惑在代码中,我必须赶上这个异常 – Johnydep 2012-01-12 15:39:58

+0

我的不好,我有遗漏import java.io.InterruptedException; ,我想我无法赶上这个例外。 – Johnydep 2012-01-13 11:22:42

回答

2

中断不会释放阻塞的readLine()调用。您必须关闭流才能执行此操作。

您已经捕捉InterruptedException的(和忽略它),这条线

catch (Exception e){} 

这将无法正常工作

line = eStream.readLine().toString() 

因为它会抛出一个NullPointerException当你到达文件的结尾。取下.toString()

+0

所以我可以通过声明它是静态的从另一个线程关闭流?但是,如果你看到我的评论上面为我的理解,我想知道我在哪里必须赶上这个异常,因为Eclipse IDE给出了这条消息,如上面我的评论中所示,谢谢 – Johnydep 2012-01-12 15:42:24

+0

就像我说的,你已经抓住了它。 – 2012-01-12 15:44:13

+0

您不必将流设置为静态,您可以在将它传递给Runnable之前对其进行定义,也可以将Runnable设置为具有close()方法的类型。 – 2012-01-12 15:49:24

2

从DOC为InterruptedException:当一个线程在等待睡眠停了 时间长,使用中断的方式 在Thread类是另一个线程中断

抛出,或以其他方式。

我怀疑你感兴趣的是InterruptedIOException:即一个I/O操作已中断

信号。一个 InterruptedIOException被抛出,表示输入或输出 传输已终止,因为执行它的线程被中断了 。

我会在干净shuttin gdown线程检查this JavaSpecialists newsletter,特别是第什么挡在IO线程?其中详细介绍了该区域。

+0

非常感谢,非常有趣的文章阅读。我会试试这个InterruptedIOException,看看它是否适用于我 – Johnydep 2012-01-12 15:54:06