012.多线程-interrupt线程的中断

版权声明:本文为博主原创文章,允许转载,请标明出处。

interrupt()

中断线程, 具体使用场景可以查看下面的源码以及注释

    /**
     * 中断线程
     *
     * 除非当前线程中断自身,
     * 否则在checkAccess中将会抛出SecurityException
     *
     * 如果当前线程在 wait、join、sleep 中被阻塞,
     * 将会清除它的中断状态(isInterrupted() is false),
     * 并抛出InterruptedException
     *
     * 如果当前线程在java.nio.channels上的I/O操作被阻塞,
     * 则通道将被关闭,线程的中断状态被设置(isInterrupted() is true),
     * 并抛出ClosedByInterruptException
     *
     * 如果当前线程在java.nio.channels.Selector中被阻塞,
     * 则线程的中断状态被设置(isInterrupted() is true),
     * 并立即返回,可能带有非零值。
     * 类似于调用了java.nio.channels.Selector的wakeup方法
     *
     * 如果上面的条件都不存在,
     * 则线程的中断状态被设置(isInterrupted() is true)
     *
     */
    public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

isInterrupted()

    /**
     * 测试这个线程是否被中断,
     * 但是线程的中断状态,不受此方法的影响
     *
     * 当一个线程死亡的时候,
     * 设置线程的中断状态将会被忽略,
     * 调用此方法将返回false
     *
     * 如果这个线程被中断(即:中断状态被设置)
     * 则返回true,否则,返回false。
     */
    public boolean isInterrupted() {
        return isInterrupted(false);
    }

interrupted()

    /**
     * 测试当前线程是否中断
     * 返回结果与isInterrupted返回值一样,
     * 
     * 但该方法会清除线程的中断状态
     * 
     * 即:不过当前线程状态如何,如果连续调用两次此方法,
     * 则,第二次调用将返回false。
     * 因为,第一次调用时已清除了中断状态。
     */
    public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }

code of demo:

package cn.qbz.thread;

import org.springframework.validation.annotation.Validated;

/**
 * @Author: 花生米
 * @Date: 2018/11/16 10:20
 */
public class InterruptTest {

    public static void main(String[] args) throws InterruptedException {
        Test2 test2 = new Test2();
        System.out.println("\n线程未启动之前:" + test2.isInterrupted());
        test2.start();
        System.out.println("\n调用interrupt前:" + test2.isInterrupted());

        test2.interrupt();
        System.out.println("\n调用interrupt,中断状态被设置:" + test2.isInterrupted());

        while (true) {
            if (test2.isAlive()) {
                Thread.sleep(2000);
            } else {
                break;
            }
        }
        System.out.println("\n线程已死亡:" + test2.isInterrupted());
    }

}

class Test2 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 600001; i++) {
            System.out.print("");

            if (i == 600000) {
                System.out.println("interrupted:" + Thread.interrupted());
                System.out.println("interrupted late::" + isInterrupted());
            }
        }
        System.out.println("线程即将死亡...");
        
        interrupt();
        System.out.println("interrupted late::" + isInterrupted());
    }

}

注意事项:

interrupted 测试的时当前线程; isInterrupted 测试的时被调用的线程。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

python3--线程,锁,同步锁,递归锁,信号量,事件,条件和定时器,队列,线程池

这个99又赋值给n,进程变量就是99,所以每次都是赋值操作,赋值了100次,最终结果99,这样还是出现数据不安全的情况

6032
来自专栏java 成神之路

基于ReentrantLock发生死锁的解决方案

3286
来自专栏Aloys的开发之路

Java杂项

JDK JDK(Java Development Kit)是一个写Java程序所需的开发环境。它由一个处于操作系统层之上的运行环境,还有开发者编译、调试和运行J...

3167
来自专栏蓝天

C/C++常见gcc编译链接错误解决方法

用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例: -Wl,-Bstatic -lmysq...

2993
来自专栏小灰灰

Java可以如何实现文件变动的监听

Java可以如何实现文件变动的监听 应用中使用logback作为日志输出组件的话,大部分会去配置 logback.xml 这个文件,而且生产环境下,直接去修改l...

3388
来自专栏MongoDB

MongoDB基础概念与事务支持

MongoDB4.0新增了对事务的支持,本文首先介绍一些MongoDB的基础概念,后文会对4.0新增的事务功能进行解读

1.2K20
来自专栏大内老A

[WCF]缺少一行代码引发的血案

这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性。具体来...

1946
来自专栏Java后端技术

关于线程池,那些你还不知道的事

  最近在学习线程相关的知识,然后顺理成章少不了学习线程池,刚开始在没有深入的学习之前,感觉线程池是很神秘的东西,而且完全想不到怎么才能实现一个自己的线程池,然...

1142
来自专栏无题

《深入理解JVM》阅读笔记以及问题整理

对阅读周志明先生的《深入理解JVM》产生的疑问与感悟以及要点进行总结。 想这种技术书应该反复读,最近又阅览了一次,才对GC部分有了一个大概的框架,可是细节部分依...

3486
来自专栏Jacklin攻城狮

iOS,面试必看,最全梳理

目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送...

2262

扫码关注云+社区

领取腾讯云代金券