谁在抛出InterruptedException?

时间:2014-11-16 23:27:53

标签: java multithreading interrupt

在下面的代码中,谁将InterruptedException扔到了线上 - (K + 1)?

public class Den implements Runnable {

    Object T = new Object(); 

    public void m1() {

        System.out.println("here ..  "); 
        synchronized(T){
            try {
                T.wait();  // line-K
            } catch (InterruptedException ex) {  // line-(K+1)
                System.out.println("An InterruptedException is thrown ");
                ex.printStackTrace();
            }
                System.out.println("here  2"); 
        }    
    } // m1()

    @Override
    public void run() {m1();}

    public static void main (String ...jsdf) {    
        Den H = new Den();
        Thread t1 = new Thread(H);
        t1.start(); 
        t1.interrupt();        // line-W
    }
}

此代码的输出是

run:
here ..  
An InterruptedException is thrown 
java.lang.InterruptedException
    at java.lang.Object.wait(Native Method)
here  2
    at java.lang.Object.wait(Object.java:502)
    at prj.Dene.m1(Dene.java:12)
    at prj.Dene.run(Dene.java:22)
    at java.lang.Thread.run(Thread.java:745)
BUILD SUCCESSFUL (total time: 0 seconds)

堆栈跟踪告诉它正在抛出它的T.wait()方法 - 应该是,在代码中没有其他任何东西抛出InterruptedException

然后 - interrupt()在线程t1上调用,而t1正在执行Runnable H作为其Thread.target对象。 怎么来T收到那个中断? interrupt()上的Thread.target是否依次调用它所等待的interrupt()个对象? Thread.interrupt()正在调用原生Thread.interrupt0() - 无法看到这些内容。

TIA。

1 个答案:

答案 0 :(得分:0)

t1.interrupt();显然是中断的启动。你可能没有意识到,但这只是#34;时间表"中断;目标线程(t1)不一定会立即受到干扰...... InterruptedException只发生在明确定义的点上,以便您可以在代码中处理它。

wait()是这些明确定义的点之一(沿着w / sleep()和一些I / O操作)。

在您的情况下,系统会在wait()调用中注入异常。不要对报告的行数太多了。