[Java]interrupt()用法

[Java]interrupt()用法一 源码阅读 1interrupt Thread interrupt 的作用其实也不是中断线程 而是通知线程应该中断了 具体来说 当对一个线程调用 interrupt 时 如果线程处于被阻塞状态 例如处于 sleep wait join 等状态 那么线程将立即退出被阻塞状态 并抛出一个 InterruptedE 异常 仅此而已 如果线程处于正常活动状态 那么

一、源码阅读

1 interrupt()

Thread#interrupt()的作用其实也不是中断线程,而是通知线程应该中断了,具体来说,当对一个线程调用interrupt() 时:

  • 如果线程处于被阻塞状态(例如处于sleep, wait, join 等状态),那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常,仅此而已。
  • 如果线程处于正常活动状态,那么会将该线程的中断标志设置为true,仅此而已。被设置中断标志的线程将继续正常运行,不受影响。

interrupt() 并不能真正的中断线程,需要被调用的线程自己进行配合才行,在正常运行任务时,经常检查本线程的中断标志位,如果被设置了中断标志就自行停止线程。具体到底中断还是继续运行,应该由被通知的线程自己处理。

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(); // Just to set the interrupt flag } 

2 interrupted()

检查当前中断标识(即查看当前中断信号是true还是false),并清除中断信号。一般处理过中断以后使用此方法。

 public static boolean interrupted() { return currentThread().isInterrupted(true); } / * Tests if some Thread has been interrupted. The interrupted state * is reset or not based on the value of ClearInterrupted that is * passed. */ private native boolean isInterrupted(boolean ClearInterrupted); 

3 isInterrupted()

检查当前中断标识(即查看当前中断信号是true还是false)

public boolean isInterrupted() { return isInterrupted(false); } 

二 、示例

以下示例展示了通过isInterrupted()、interrupt()如何终止执行中的线程,如下所示代码中中创建了两个线程(thread1、thread2),thread1每隔500ms数数一次,thread2休眠一段时间以后中断thread1,thread1将会终止。

import java.util.Random; / * @author Leon * @create 2019-07-26-15:02 */ public class Thread1 { public static void main(String[] args) { Thread thread1 = new Thread(() -> { try { int i = 0; while (!Thread.currentThread().isInterrupted()) { Thread.sleep(500); System.out.println("couting... i=" + i); i++; } } catch (InterruptedException e) { e.printStackTrace(); System.out.println("thread1 interrupted"); } }); Thread thread2 = new Thread(() -> { Random random = new Random(); try { long time = random.nextInt(3000) + 1000; Thread.sleep(time); System.out.println("interrupt thread1"); thread1.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } }); thread1.start(); thread2.start(); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227591.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:58
下一篇 2026年3月16日 下午8:58


相关推荐

  • UAT SIT QAS DEV PET「建议收藏」

    UAT SIT QAS DEV PET「建议收藏」UAT:UserAcceptanceTesting用户验收测试SIT:SystemIntegrationTesting系统集成测试PET:PerformanceEvaluationTest性能鉴定试验DEV:DevelopmentSystem开发系统QAS:QualityAssurancesystem质量保证体系PRO:professional专…

    2022年6月28日
    42
  • MidJourney 绘画变现:3 类高需求场景 + 定价策略

    MidJourney 绘画变现:3 类高需求场景 + 定价策略

    2026年3月15日
    7
  • EasyUI学习笔记

    EasyUI学习笔记

    2021年7月11日
    87
  • div内容居中显示

    div内容居中显示br nbsp DOCTYPEhtmlP W3C DTDXHTML1 0 http www w3 org TR xhtml1 DTD xhtml1 transitional dtd htmlxmlns http www w3 org 1999 xhtml headtitle 多行文字实现垂直居中 titlemetahtt equiv Content Type content text html charset utf 8

    2026年3月16日
    2
  • Anaconda和Pycharm安装和配置教程[通俗易懂]

    Anaconda和Pycharm安装和配置教程[通俗易懂]1、下载Anaconda2(最好选Python2.7的,兼容性好点)在官网下载:https://www.continuum.io/downloads新路径https://www.anaconda.com/distribution/2、安装Pycharm(顺便激活成功教程,不需要激活成功教程工具)默认下一步,安装好就OK了。手动配置Pycharm所用解释器3、打开“文件”—“设置”,它会自动检测…

    2022年8月27日
    8
  • 机器人slam技术_激光二维扫描仪

    机器人slam技术_激光二维扫描仪机器人开发–二维激光SLAM介绍1SLAM简介1.1概述1.2应用1.3历史发展2SLAM中3个模块2.1前端里程计模块实现原理实现方法2.2后端优化模块2.3回环检测模块参考1SLAM简介1.1概述SLAM本质就是确定自己在哪里的哪里,如在苏州中心的正东边66米处。SLAM(SimultaneousLocalizationandMapping),也称为CML(ConcurrentMappingandLocalization),即时定位与地图构建,或并发

    2022年8月23日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号