搜索
您的当前位置:首页中断线程后第一个park方法失效

中断线程后第一个park方法失效

来源:爱问旅游网

如下代码中,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()不会阻塞

参考:

因篇幅问题不能全部显示,请点此查看更多更全内容

Top