文章目录
- 前言
- 一、原书中的代码
- 二、interrupt,isInterrupted,interrupted区分
-
- interrupt
- isInterrupted
- interrupted
前言
今天在看《Java并发编程之美》这本书的时候,发现了一个关于interrupted方法的描述,感觉看的一脸懵逼,然后我又通过百度了一下才明白了作者想要表达的意思,所以在这里特地的记录一下心得。一、原书中的代码
package com.code.test;public class TestInterrupted {
public static void main(String[] args) {
Thread threadOne = new Thread(new Runnable() {
@Overridepublic 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() {
@Overridepublic 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,只是给里面加了一个布尔值