如下代码中,park1不能生效
public static void main(String[] args) throws InterruptedException {
ThreadPoolExecutor tpe =
new ThreadPoolExecutor(1, 1, 0, TimeUnit.SECONDS, new LinkedBlockingQueue());
tpe.execute(() -> {
try {
Thread.sleep(1000000);
} catch (Exception e) {
Thread.interrupted();
LockSupport.park(); // park1
LockSupport.park(); // park2
}
});
Thread.sleep(1000);
tpe.shutdownNow();
}
分析:
shutdownNow原理是修改正在运行的线程中断状态为interrupted=true
因此会触发sleep方法中断异常,
使用Thread.interrupted(),将线程中断状态interrupted=false
理论分析此时使用park1应该就会阻塞,可是为什么没有阻塞呢?
原因:
interrupt()实现的伪代码如下
interrupt(){
if(中断状态 == false) {
中断状态 = true;
}
unpark(this); //注意这是Thread的成员方法,所以可以通过this获得Thread对象
}
interrupt()会设置中断状态为true。并且会调用unpark()方法,将permit置为1的。
因此,当线程被interrupt()方法中断时,第一个park()不会阻塞
参考:
因篇幅问题不能全部显示,请点此查看更多更全内容