【问题标题】:Interrupting Thread in Java for hanged process在Java中为挂起的进程中断线程
【发布时间】:2012-01-12 15:35:01
【问题描述】:

如果我有这样的线程:

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 时,出现编译时错误。有人可以告诉我在这种情况下,我怎样才能捕获中断异常?

谢谢

【问题讨论】:

  • 你能显示导致编译时错误的代码吗?
  • @marchaos 实际上错误消息说 InterruptedException 的无法到达捕获块。这个异常永远不会从 try 语句体中抛出。所以我很困惑我必须在代码中的哪个位置捕获这个异常
  • 我的错,我错过了 import java.io.InterruptedException;我想我无法在那里捕捉到这个异常。

标签: java multithreading interrupted-exception


【解决方案1】:

中断不会释放阻塞的 readLine() 调用。你必须关闭流才能做到这一点。

您已经用这一行捕获了 InterruptedException(并忽略它)

catch (Exception e){}

这行不通

line = eStream.readLine().toString()

因为当您到达文件末尾时它会抛出 NullPointerException。删除.toString()

【讨论】:

  • 所以我可以通过将流声明为静态来关闭来自另一个线程的流?但是,如果您看到我上面的评论以了解我的理解,我想知道我必须在哪里捕获这个异常,因为 Eclipse IDE 给出了如我上面的评论所示的消息,谢谢
  • 您不必将流设为静态,您可以在将其传递给 Runnable 之前对其进行定义,或者将 Runnable 设为具有 close() 方法的类型。
  • 感谢您指出正确的方向。当然,我现在就试试。
  • 我已经尝试过,但我无法关闭阻塞的 IO 流。它什么也不做,如果我尝试从任何地方关闭它,该调用也会卡在没有任何事情发生的情况下。实际上我不是在读取文件,而是使用 Runtime.getRuntime().exec 从 Windows cmdline 读取输出
  • 在那种情况下,我会尝试 Process.destroy()
【解决方案2】:

来自InterruptedException的文档:

当线程等待、休眠或以其他方式暂停时抛出 很长一段时间,另一个线程使用中断方法将其中断 在线程类中。

我怀疑你感兴趣的是InterruptedIOException

表示 I/O 操作已被中断。一个 抛出 InterruptedIOException 以指示输入或输出 传输已终止,因为执行它的线程是 被打断了。

我会查看 this JavaSpecialists newsletter 关于干净关闭 gdown 线程的内容,尤其是 IO 上阻塞的线程怎么样? 小节,其中详细介绍了该领域。

【讨论】:

  • 非常感谢,非常有趣的文章值得阅读。我要试试这个 InterruptedIOException 看看它是否适合我
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多