回顾-线程中断机制

线程中断的定义:

当线程的执行过程需要被打断时,就涉及到线程的中断机制。中断可以简单理解为在线程执行过程中发出一个打断信号,以使线程在执行途中退出。在Java中,中断机制是一种线程间 协作的机制,允许一个线程通过向另一个线程发送中断请求来影响其执行。

但是,中断并不意味着目标线程必须立即终止,而是一种通知机制。目标线程在接收到中断请求后,可以选择采取相应的操作,例如终止执行、抛出InterruptedException异常,或者忽略中断请求并继续执行。

在Java中,每个线程对象都包含一个中断标识位,用于标识线程是否被中断。这个标识位的状态可以被线程内部的代码检测,以决定如何响应中断请求。这种灵活的机制使得线程能够更好地适应外部的控制和协作需求。

中断机制的API:

  • public void interrupt()
    • 将线程的中断标识位设置为true,不会中断线程,相当于发送了一个中断信号.
  • public boolean isInterrupted() - Thread.currentThread().isInterrupted()
    • 判断当前线程的中断标识位是否为true,不会将中断标识位置位.
  • public static boolean interrupted() - Thread.interrupted()
    • 判断当前线程的中断标识位是否为true,且会将中断标识位置位(重置为false).

示例:

java 复制代码
public class InterruptExample {
    public static void main(String[] args) {
        Thread workerThread = new Thread(() -> {
            // 模拟一个耗时任务
            for (int i = 0; i < 5; i++) {
                if (Thread.interrupted()) {
                    System.out.println("Thread interrupted. Cleaning up...");
                    // 可以进行一些清理工作
                    return; // 可以选择终止线程
                }

                // 模拟耗时任务的执行
                System.out.println("Working on task " + i);
                doSomeHeavyProcessing(i);
            }
        });

        workerThread.start(); // 启动工作线程

        // 主线程等待一段时间后中断工作线程
        try {
            Thread.sleep(1000);
            workerThread.interrupt(); // 中断工作线程
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void doSomeHeavyProcessing(int taskId) {
        // 模拟耗时任务的执行
        long sum = 0;
        for (int i = 1; i <= 999999999; i++) {
            sum += i;
        }
        // 打印当前是第几次循环和计算结果
        System.out.println("Task [" + taskId + "]  Result: " + sum);
    }
}

结果:

arduino 复制代码
Working on task 0
Task [0]  Result: 499999999500000000
Working on task 1
Task [1]  Result: 499999999500000000
Working on task 2
Task [2]  Result: 499999999500000000
Thread interrupted. Cleaning up...

分析:

  1. 启动工作线程: 主线程创建并启动了一个工作线程,该工作线程模拟执行耗时任务。
  2. 工作线程执行耗时任务: 工作线程在循环中执行耗时任务,每次迭代都会检查中断状态。
  3. 主线程等待一秒后中断工作线程: 主线程等待1秒钟后,通过调用workerThread.interrupt()向工作线程发送中断信号,即将中断标识位设置为true
  4. 工作线程检测中断信号: 在工作线程的循环中,通过if (Thread.interrupted())检查中断状态。如果中断状态为true,则执行清理工作并结束工作线程。

小记:

  1. 中断是引起线程注意的一种方式: 中断是一种线程间的通信机制,它可以用于在某个线程中发出一个信号,通知该线程发生了某个事件,例如需要终止或需要执行某种处理。
  2. 被中断的线程可以决定如何响应中断: Java中的线程被中断后,并不意味着它必须立即终止。线程本身可以根据具体情况选择如何处理中断,比如继续执行、立即终止、或者进行清理工作后再终止。
  3. 某些线程可能会忽略中断并继续执行: 有些线程可能是如此重要,以至于它们不能被中断。在这种情况下,线程可能会在捕获到中断信号后进行一些处理,但仍然继续执行。
  4. 更普遍的情况是线程将中断视为终止请求: 在许多情况下,线程会简单地将中断视为一个终止的请求。当线程检测到自己被中断时,它可以选择终止执行或采取其他适当的措施。
相关推荐
麦兜*1 小时前
Spring Boot 企业级动态权限全栈深度解决方案,设计思路,代码分析
java·spring boot·后端·spring·spring cloud·性能优化·springcloud
ruan1145142 小时前
MySQL4种隔离级别
java·开发语言·mysql
Hellyc6 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen6 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge6 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再7 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂7 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
有没有没有重复的名字8 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
程序员的世界你不懂10 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
java·selenium·maven
isNotNullX10 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark