interrupt,isInterrupted,interrupted的区分


前言

今天在看《Java并发编程之美》这本书的时候,发现了一个关于interrupted方法的描述,感觉看的一脸懵逼,然后我又通过百度了一下才明白了作者想要表达的意思,所以在这里特地的记录一下心得。

一、原书中的代码

package com.code.test;

public class TestInterrupted {
    public static void main(String[] args) {
        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                for (; ; ) {

                }
            }
        });

        threadOne.start();
        threadOne.interrupt();

        System.out.println("is interrupt:" + threadOne.isInterrupted());

        System.out.println("is interrupt:" + threadOne.interrupted());

        System.out.println("is interrupt:" + Thread.interrupted());

        System.out.println("is interrupt:" + threadOne.isInterrupted());
    }
}

原文描述
在我看来按理说结果应该就是true,false,false,因为threadOne这个线程在启动以后,被interrupt掉,那么第一次获取线程isInterrupted的状态是true没问题,然后第二次又调用
interrupted方法,来判断线程是否被中断,如果被中断,返回的应该是true,并清除中断状态,然后调用主线程的interrupted方法,判断线程是否被中断,返回一个布尔值并清除中断状态,这个时候主线程还在运行中,肯定没有中断,返回的是false,最后一个又调用threadOne线程的isInterrupted方法,判断threadOne线程是否中断,因为threadOne已经被中断了,所以返回的肯定是true,按照我们通常对这三个方法的判断,结果就应该是true,false,false对吧,但是!!因为我们的线程是在main函数中运行的,所以我们在获取当前线程的中断状态的时候,获取的应该是主线程(main线程)的中断状态,也就是书里面说的,无论是threadOne.interrupted()还是Thread.interrupted(),其实都是Thread.interrupted(),所以第二次和第三次的interrupted方法,都是获取的主线程的中断状态,显然,主线程没有被中断,所以打印的结果都是false,所以最终的结果也就是书里面的结果:true,false,false,true

我自己为了测试一下,把书里面的代码又进行的改动,方便自己以后回忆理解

package com.code.test;

public class TestInterrupted {
    public static void main(String[] args) {
        Thread threadOne = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("thread method thread name:" + Thread.currentThread());
                System.out.println("threadOne method thread isInterrupted:" + Thread.currentThread().isInterrupted());
                System.out.println("threadOne method thread interrupted:" + Thread.currentThread().interrupted());
                for (; ; ) {

                }
            }
        });

        threadOne.start();
        threadOne.interrupt();

        System.out.println("is interrupt:" + threadOne.isInterrupted());

        System.out.println("is interrupt:" + threadOne.interrupted());

        System.out.println("current thread name:" + Thread.currentThread());

        System.out.println("is interrupt:" + Thread.interrupted());

        System.out.println("is interrupt:" + threadOne.isInterrupted());
    }
}

在这里插入图片描述

我给threadOne的run方法里面添加了threadOne线程的interrupted和isInterrupted的打印,发现结果和我想象的一致,threadOne子线程里面打印的interrupted结果是true,因为是threadOne线程在开始就被interrupted掉了,所以现在的状态肯定是true,然后isInterrupted也是true,而且,我在打印线程名称的时候同样也可以发现,子线程里面打印的是Thread-0,主线程里面打印的是main,两者还是有所不同的。

二、interrupt,isInterrupted,interrupted区分

interrupt

用来中断线程,但是实际中不是中断线程,而是给当前的线程加一个状态,表示已经中断了,而且我们要注意,这个地方添加中断状态的线程不一定是当前的线程,而是指调用这个interrupt方法的线程

isInterrupted

用来判断当前的线程是否被中断,返回一个boolean值,用来判断线程是否被中断

interrupted

用来判断当前的线程是否被中断,并清除中断状态,返回一个boolean值,用来判断线程是否被中断,如果连续两次调用interrupted方法,那么第一次返回的是true,清除了线程的中断状态,那么第二次就会返回一个false,因为线程的中断状态已经被清除了

还有一个最重要点,interrupted作用于当前线程,interrupt和isInterrupted作用于调用他们的线程,这个可以从书里面的例子明显的看出来,而我们通过看interrupted的源码可以看到,其实interrupted也是调用的isInterrupted,只是给里面加了一个布尔值
源码

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值