14

基本上,问题标题所说的。

Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?

从我自己的测试来看,似乎是,但只是想确定一下。我猜在执行“等待”例程之前Thread.join()检查线程的状态?interrupted

4

3 回答 3

23

在 Thread.join() 之前调用 Thread.interrupt() 会导致 join() 立即抛出 InterruptedException 吗?

不,它不会抛出。只有在调用该方法的当前join()线程被中断时才会join()抛出InterruptedException. t.interrupt()正在中断您刚刚启动的线程,而只有在执行连接的线程(可能是主线程?)本身被中断时t.join()才会抛出。InterruptedException

 Thread t = new Thread(someRunnable);
 t.start();
 t.interrupt();
 t.join();  // will _not_ throw unless this thread calling join gets interrupted

同样重要的是要意识到中断线程不会取消它,并且 join()不像 aFuture那样它将返回线程抛出的异常。

当您中断一个线程时,该线程对sleep()wait()join()和其他可中断方法的任何调用都将抛出InterruptedException。如果没有调用这些方法,那么线程将继续运行。如果线程确实抛出 aInterruptedException以响应被中断然后退出,那么除非您使用t.setDefaultUncaughtExceptionHandler(handler).

在您的情况下,如果线程因为返回而被中断并完成,那么连接将完成——它不会引发异常。正确处理中断的常用线程代码如下:

 public void run() {
    try {
       Thread.sleep(10000);
    } catch (InterruptedException e) {
       // a good pattern is to re-interrupt the thread when you catch
       Thread.currentThread().interrupt();
       // another good pattern is to make sure that if you _are_ interrupted,
       // that you stop the thread
       return;
    }
 }
于 2012-05-17T11:38:02.973 回答
19

interrupt()中断您中断的线程,而不是执行中断的线程。

参考

Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException 
于 2012-05-17T08:52:19.480 回答
1

interrupt()将中断引用线程的执行,如果它受sleep()orwait()或影响join()

  1. 由于没有在 main 上调用 sleep /join /wait,这只会更新interrupted标志。
  2. 验证语句 1
  3. t1.join()暂停执行MAIN thread并允许 t1 在MAIN thread继续之前执行。但是,似乎主要Thread.currentThread().isIntercepted()通过引发异常进行内部检查和处理。
  4. 验证语句 3
  5. 验证语句 3,并且由于异常已引发intercepted标志设置回 false

示例代码:

        t1.start();
        System.out.println(Thread.currentThread().getName()+" isInterrupted(): "+Thread.currentThread().isInterrupted());
        try {
            Thread.currentThread().interrupt(); // -- 1
            System.out.println(Thread.currentThread().getName()+" isInterrupted(): "+Thread.currentThread().isInterrupted()); // -- 2
            t1.join(); // -- 3
            System.out.println("This is never called as exception is raised"); // -- 4
        }catch(InterruptedException ex){
            System.out.println(Thread.currentThread().getName()+" isInterrupted(): "+Thread.currentThread().isInterrupted()); -- 5
        }
        System.out.println("Main continues");

输出:

main isInterrupted(): false
Thread-0: 0
main isInterrupted(): true
main isInterrupted(): false
Main continues
Thread-0: 1
Thread-0: 2
Thread-0: 3

以上电话来自main()

我希望这将有助于更好地理解

于 2021-09-10T09:42:16.967 回答