基本上,问题标题所说的。
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?
从我自己的测试来看,似乎是,但只是想确定一下。我猜在执行“等待”例程之前Thread.join()
检查线程的状态?interrupted
基本上,问题标题所说的。
Thread t = new Thread(someRunnable);
t.start();
t.interrupt();
t.join(); //does an InterruptedException get thrown immediately here?
从我自己的测试来看,似乎是,但只是想确定一下。我猜在执行“等待”例程之前Thread.join()
检查线程的状态?interrupted
在 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;
}
}
interrupt()
中断您中断的线程,而不是执行中断的线程。
参考
Thread.currentThread().interrupt();
t.join(); // will throw InterruptedException
interrupt()
将中断引用线程的执行,如果它受sleep()
orwait()
或影响join()
。
interrupted
标志。t1.join()
暂停执行MAIN thread
并允许 t1 在MAIN thread
继续之前执行。但是,似乎主要Thread.currentThread().isIntercepted()
通过引发异常进行内部检查和处理。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()
我希望这将有助于更好地理解