当前位置: 代码迷 >> 综合 >> interrupt,isInterrupted,interrupted的区分
  详细解决方案

interrupt,isInterrupted,interrupted的区分

热度:46   发布时间:2023-12-15 12:00:03.0

文章目录

  • 前言
  • 一、原书中的代码
  • 二、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,只是给里面加了一个布尔值
源码

  相关解决方案