在Java中为挂起的进程中断线程

在Java中为挂起的进程中断线程,java,multithreading,interrupted-exception,Java,Multithreading,Interrupted Exception,如果我有这样一条线: 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){ //

如果我有这样一条线:

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()
会被挂起,因为它需要来自外部进程的输入。所以在这种情况下,我要做的是设置一个计时器,如果计时器过期,我用
t.interrupt()中断这个线程t

现在,当我在try块之后尝试捕获
InterruptedException
时,我得到了编译时错误。有人能告诉我在这个场景中,我如何捕获中断的异常吗


谢谢

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

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

catch (Exception e){}
这行不通

line = eStream.readLine().toString()

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

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

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

catch (Exception e){}
这行不通

line = eStream.readLine().toString()
因为当您到达文件末尾时,它将抛出NullPointerException。从文档中删除
.toString()

,用于:

当线程正在等待、休眠或以其他方式暂停某个线程时引发 长时间,另一个线程使用中断方法中断它 课堂上的线程

我想你感兴趣的是:

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

我会查看cleanly shuttin gdown线程,特别是关于IO上阻塞的线程的小节。详细介绍了这一领域。

来自文档:

当线程正在等待、休眠或以其他方式暂停某个线程时引发 长时间,另一个线程使用中断方法中断它 课堂上的线程

我想你感兴趣的是:

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



我会检查干净的关闭gdown线程,特别是关于IO上阻塞的线程如何?小节,该小节详细介绍了这一领域。

您能显示导致编译时错误的代码吗?@marchaos实际上错误消息说InterruptedException的捕获块不可访问。决不会从try语句体引发此异常。所以我很困惑,在代码中我应该在哪里捕捉到这个异常?很糟糕,我丢失了import java.io.InterruptedException;我想我无法捕捉到这个异常。你能显示导致编译时错误的代码吗?@marchaos实际上错误消息说InterruptedException的捕捉块不可访问。决不会从try语句体引发此异常。所以我很困惑,在代码中我应该在哪里捕捉到这个异常?很糟糕,我丢失了import java.io.InterruptedException;我想我无法捕捉到这个异常,所以我可以通过声明流为静态来关闭另一个线程的流?但是,如果您看到我上面的评论,我想知道我必须在哪里捕获此异常,因为Eclipse IDE给出了如我上面的评论所示的消息,谢谢您不必使流成为静态的,您可以在将其传递给Runnable之前对其进行定义,或者使Runnable成为具有close()的类型方法。谢谢你指出了正确的方向。当然我现在会试试。我已经试过了,但是我无法关闭阻塞的IO流。它什么也不做,如果我尝试从任何地方关闭它,该调用也会被困在没有发生任何事情的情况下。实际上,我不是在读取文件,而是在使用Runtime.getRuntime()从windows cmdline读取输出。在这种情况下,我会尝试Process.destroy(),以便通过声明流为静态来关闭另一个线程的流?但是,如果您看到我上面的评论,我想知道我必须在哪里捕获此异常,因为Eclipse IDE给出了如我上面的评论所示的消息,谢谢您不必使流成为静态的,您可以在将其传递给Runnable之前对其进行定义,或者使Runnable成为具有close()的类型方法。谢谢你指出了正确的方向。当然我现在会试试。我已经试过了,但是我无法关闭阻塞的IO流。它什么也不做,如果我尝试从任何地方关闭它,该调用也会被困在没有发生任何事情的情况下。实际上,我不是在阅读文件,而是在使用Runtime.getRuntime()从windows cmdline读取输出。在这种情况下,我会尝试Process.destroy(),非常感谢您阅读这篇非常有趣的文章。我要试试这个InterruptedIOException,看看它是否对我有用,你可以读一篇非常有趣的文章。我要试试这个InterruptedIOException,看看它对我是否有效