Java并发编程基础-理解中断

简介: 章节什么是中断中断线程的方法线程中断状态的判断以及何时被中断的线程所处 isInterrupted() 状态为 false?1.什么是中断线程标识位中断可以理解为线程的一个标识位属性,它标识一个运行中的线程是否被其他线程进行了中断操作。

章节

  • 什么是中断
  • 中断线程的方法
  • 线程中断状态的判断以及何时被中断的线程所处 isInterrupted() 状态为 false?

1.什么是中断

线程标识位

中断可以理解为线程的一个标识位属性,它标识一个运行中的线程是否被其他线程进行了中断操作。

2.中断线程的方法

其他线程通过调用该线程的 interrupt() 方法对其进行中断操作。
其实就是其他线程对该线程打了个招呼,要求其中断。

3. 线程中断状态的判断

线程通过方法isInterrupted()方法来进行判断是否被中断。

如下两种情况需要注意:

1.如果被中断的线程已经处于终结状态,那么调用该线程对象的 thread.isInterrupted() 返回的仍是 false。
2.在Java API中可以看到,许多抛出 InterruptedException 的方法,(其实线程已经终结了,因为遇到了异常)如Thread.sleep( long mills) 方法)这些方法在抛出InterruptedException 异常之前,JVM会将中断标识位清除,然后抛出InterruptedException,此时调用isInterrupted()仍会返回false。

package org.seckill.Thread;

import java.util.concurrent.TimeUnit;

public class Interrupted {

    public static void main(String[] args) throws InterruptedException{
        Thread sleepThread = new Thread(new SleepRunner(),"sleepRunner");
        sleepThread.setDaemon(true);//支持性线程
        Thread busyThread = new Thread(new BusyRunner(),"busyRunner");
        busyThread.setDaemon(true);

        sleepThread.start();
        busyThread.start();

        TimeUnit.SECONDS.sleep(5);

        sleepThread.interrupt();
        busyThread.interrupt();

        System.out.println("sleep Thread interrupted status is:"+sleepThread.isInterrupted());
        System.out.println("busy Thread interrupted status is:"+busyThread.isInterrupted());

        SleepUnit.second(500);

    }

    /**
     * 沉睡中的线程-静态内部类
     */
    static class SleepRunner implements Runnable {
        public void run() {
            while (true) {
                SleepUnit.second(10);
            }
        }
    }

    /**
     * 不停运行,空耗cpu的线程-静态内部类
     */
    static class BusyRunner implements Runnable {
        public void run() {
            while (true) {

            }
        }
    }

    /**
     * 静态内部工具类
     */
    static class SleepUnit {
        public static void second(int seconds) {
            try {
                TimeUnit.SECONDS.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:


img_26dda2654df36e2e44ee1911575b94fa.png
运行结果

我们可以发现 sleep线程的 isInterrupted 状态为false,其中断标识位被清除了。
busy 线程属于正常中断所以isInterrupted 状态为 true,中断标识位没有被清除。

目录
相关文章
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
649 83
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
482 6
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
562 1
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
1599 2
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
1430 3
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
463 0
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
731 100
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
767 16
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
886 1