返回顶部
首页 > 资讯 > 后端开发 > Python >Java多线程之Interrupt中断线程详解
  • 931
分享到

Java多线程之Interrupt中断线程详解

2024-04-02 19:04:59 931人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、测试代码二、测试三、执行过程描述四、输出日志五、结论六、主要方法释义七、DEMO八、拓展程序九、实战一、测试代码 https://gitee.com/zture/sprin

一、测试代码

https://gitee.com/zture/spring-test/blob/master/multithreading/src/test/java/cn/diswares/blog/InterruptTests.java

二、测试

为了方便理解简介中 interrupt 的概念, 写个 DEMO 测试一下


 
@Test
public void testInvokeInterrupt() throws InterruptedException {
    Thread t1 = new Thread(() -> {
    for (int i = 0; ; i++) {
    log.info(i + "");
    }
    });
    t1.start();
    // 确保 t1.start() 成功执行
    Thread.sleep(1);
    log.info("interrupt 前 t1 interrupt 状态 = {}", t1.isInterrupted());
    t1.interrupt();
    log.info("interrupt 后 t1 interrupt 状态 = {}", t1.isInterrupted());
    log.info("t1 是否存活 = {}", t1.isAlive());
}

三、执行过程描述

  • 首先 main 线程中启动 t1线程
  • t1 线程死循环输出 i++
  • main 线程确保 t1.start() 执行后
  • 打印 t1 线程的线程中断状态
  • 调用 t1.interrupt() 方法使线程中断
  • 打印 t1 线程的线程中断状态

四、输出日志

ignore logs ......
20:29:57.632 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2561
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2562
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2563
20:29:57.486 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupt 前 t1 interrupt 状态 = false
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2564
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2565
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2566
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2567
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2568
20:29:57.633 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupt 后 t1 interrupt 状态 = true
20:29:57.633 [main] INFO cn.diswares.blog.interrupt.InterruptTests - t1 是否存活 = true
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2569
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2570
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2571
ignore logs ......

现象描述

  • 调用 t1.interrupt() 执行前线程的 interrupt 状态为 false
  • 调用 t1.interrupt() 执行后线程的 interrupt 状态为 true
  • 线程并没有被中断, 可以成功死循环输出循环次数

五、结论

Interrupt 的真正作用是给线程对象设置一个中断标记, 并不会影响线程的正常运行

六、主要方法释义

new Thread().interrupt()

中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。

Thread.interrupted()

注意: 这是个静态方法
测试当前线程是否被中断(检查中断标志), 返回一个当前线程的 interrupt 状态, 并重置.
当我们第二次调用时中断状态已经被重置, 将返回一个false
为了方便理解. 写一个 DEMO

七、DEMO

DEMO 非常简单, 调用两次 Thread.interrupted() 观察 main 线程的 interrupt 标记



@Test
public void testDoubleInvokeInterrupted () throws InterruptedException {
    Thread.currentThread().interrupt();
    log.info("interrupted1 = {}", Thread.interrupted());
    log.info("interrupted2 = {}", Thread.interrupted());
}

输出日志

21:06:33.397 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupted1 = true
21:06:33.402 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupted2 = false

八、拓展程序

由于是静态方法. 我们来看一下另一个小程序.

  • 跟之前一样将 t1 程序中断
  • 调用 t1.interrupted()
  • 注意这里是个静态方法


@Test
public void testMainInterrupted() throws InterruptedException {
    Thread t1 = new Thread(() -> {
        for (int i = 0; ; i++) {
            log.info("t1 is live");
        }
    });

    t1.start();
    Thread.sleep(1);
    t1.interrupt();
    Thread.sleep(1);
    log.info("{}", t1.interrupted());
}

拓展程序日志

ignore logs ......
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.490 [main] INFO cn.diswares.blog.interrupt.InterruptTests - false
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
ignore logs ......

拓展程序结论

  • Thread.interrupted() 方法是静态方法
  • 它的实现为 Thread.currentThread(), 获取的是当前正在执行的线程, jdk 原文注释如下

Returns a reference to the currently executing thread object.

Returns: the currently executing thread.

  • 所以这里 t1.interrupted() 返回的其实是 main 线程的线程中断标记

new Thread().isInterrupted()

返回线程对象的中断标记, 不会改变中断标记

  • true: 中断标记存在
  • false: 未设置中断标记状态

优雅的结束一个线程

在 Java 中结束一个线程一般有下面三种手段:

  • (禁用) Thread.stop() 这个方法已经被废弃. 因为这种结束线程的方式过于暴力. 会将当前线程暴力终结. 同时线程持有的也都会释放, 并且用户有任何额外的处理来控制, 会导致数据不一致
  • volatile: 外部申明 volatile 开关变量, 当开关条件不满足时结束
  • (推荐) interrupt: 最优雅的方案

九、实战

最初的 DEMO 是个死循环, 那我们对其改造一下. 让它能够优雅的结束



@Test
public void testGracefulEndThread() throws InterruptedException {
    Thread t1 = new Thread(() -> {
        for (int i = 0; ; i++) {
            if (Thread.currentThread().isInterrupted()) {
                log.info("{} = true, i = {}", Thread.currentThread().getName(), i);
                break;
            } else {
                log.info("{} = false, i = {}", Thread.currentThread().getName(), i);
            }
        }
    });
    t1.start();
    // 确保 t1.start() 成功执行
    TimeUnit.SECONDS.sleep(1);
    t1.interrupt();
    TimeUnit.SECONDS.sleep(1);
    log.info(t1.getState().toString());
}

到此这篇关于Java多线程之Interrupt中断线程详解的文章就介绍到这了,更多相关Java Interrupt中断线程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java多线程之Interrupt中断线程详解

本文链接: https://www.lsjlt.com/news/126354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java多线程之Interrupt中断线程详解
    目录一、测试代码二、测试三、执行过程描述四、输出日志五、结论六、主要方法释义七、DEMO八、拓展程序九、实战一、测试代码 https://gitee.com/zture/sprin...
    99+
    2024-04-02
  • Java多线程之Interrupt中断线程的示例分析
    小编给大家分享一下Java多线程之Interrupt中断线程的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、测试代码https://gitee.com/zture/spring-test/blob/master...
    99+
    2023-06-15
  • java线程中断之interrupt和stop
    interrupt方法当我们调用线程的sleep方法或者join方法时,都可以让某一些线程处于等待状态,调用当前线程的interrupt()方法就可以打断该阻塞状态。interrupt方法不会让线程结束。public void interr...
    99+
    2019-09-17
    java教程 java 线程中断 interrup stop
  • java线程中断 interrupt 和 LockSupport解析
    目录本文大纲线程中断相关方法sleep 响应中断LockSupport方法介绍park/unpark和 wait/notify区别本文大纲 本文章将要介绍的内容有以下几点,读者朋友...
    99+
    2023-02-22
    java 线程中断 java interrupt LockSupport
  • java 中断线程的几种方式 interrupt()详解
    中断   中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作。线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序...
    99+
    2024-04-02
  • 线程中断 interrupt 和 LockSupport
    本文章将要介绍的内容有以下几点,读者朋友也可先自行思考一下相关问题:线程中断 interrupt 方法怎么理解,意思就是线程中断了吗?那当前线程还能继续执行吗?判断线程是否中断的方法有几个,它们之间有什么区别?LockSupport的 pa...
    99+
    2023-06-02
  • Java多线程之线程状态详解
    目录 线程状态停止线程线程休眠模拟网络延迟(放大问题的发生性)模拟计时线程礼让插队(线程强制执行)线程状态观测线程优先级守护线程总结 线程状态 五个状态:新生、就...
    99+
    2024-04-02
  • Java线程中断interrupt的常用方法
    目录前言示例说明注意事项Object#wait 和 Thread.sleep 差异在哪里总结前言 这里主要探讨中断常用的三个方法: interrupt()。在一个线程中调用需要中断现...
    99+
    2024-04-02
  • Java多线程之线程安全问题详解
    目录1. 什么是线程安全和线程不安全?2. 自增运算为什么不是线程安全的?3. 临界区资源和竞态条件总结:面试题: 什么是线程安全和线程不安全?自增运算是不是线程安全的?如何保证多线...
    99+
    2024-04-02
  • Java多线程之死锁详解
    目录1、死锁2、死锁经典问题——哲学家就餐问题 总结1、死锁 出现场景:当线程A拥有了A对象的锁,想要去获取B对象的锁;线程B拥有了B对象的锁,想要拥有A对象的锁,两个线程...
    99+
    2024-04-02
  • Java多线程之线程池七个参数详解
    目录corePoolSize:核心线程数maximumPoolSize:最大线程数keepAliveTime:空闲线程存活时间unit:时间单位workQueue:工作队列threa...
    99+
    2024-04-02
  • Java多线程之线程状态的迁移详解
    目录一、六种状态二、状态迁移图三、线程状态模拟总结一、六种状态 java.lang.Thread 的状态分为以下 6 种,它们以枚举的形式,封装在了Thread类内部: NEW:表...
    99+
    2024-04-02
  • Android 多线程处理之多线程详解
    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程。 1.如...
    99+
    2022-06-06
    多线程 线程 Android
  • C#多线程之线程池ThreadPool详解
    一、ThreadPool概述 提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。 创建线程需要时间。如果有不同的小任务要完成,就可...
    99+
    2024-04-02
  • Python线程之多线程展示详解
    目录什么多线程?获取活跃线程相关数据总结什么多线程? 多线程,就是多个独立的运行单位,同时执行同样的事情。 想想一下,文章发布后同时被很多读者阅读,这些读者在做的事情‘阅读'就是一...
    99+
    2024-04-02
  • java线程中断interrupt和LockSupport的方法是什么
    本文小编为大家详细介绍“java线程中断interrupt和LockSupport的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“java线程中断interrupt和LockSupport的方法是什么”文章能帮助大家解决疑惑,下...
    99+
    2023-07-05
  • Java多线程之线程同步
    volatile 先看个例子 class Test { // 定义一个全局变量 private boolean isRun = true; // 从主线程调...
    99+
    2024-04-02
  • Java多线程之线程安全问题详情
    目录1.线程安全概述1.1什么是线程安全问题1.2一个存在线程安全问题的程序2.线程加锁与线程不安全的原因2.1案例分析2.2线程加锁2.2.1什么是加锁2.2.2如何加锁2.2.3...
    99+
    2024-04-02
  • java中使用interrupt通知线程停止详析
    目录普通情况停止线程在可能被阻塞情况下停止线程在每次迭代后都阻塞的情况下停止线程两种停止线程最佳方法总结前言: 使用 interrupt 来通知线程停止运行,而不...
    99+
    2024-04-02
  • Java并发编程之线程中断
    目录线程中断: void interrupted()方法:中断线程,例如,当线程A运行时,线程B可以调用线程A的interrupted()方法来设置线程的中断标志为true并立即返回...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作