中断在java中主要有3个方法,interrupt(),isInterrupted()和interrupted()

public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0();           // Just to set the interrupt flagb.interrupt(this);return;}}// private native void interrupt0();interrupt0();}
public boolean isInterrupted() {// private native boolean isInterrupted(boolean ClearInterrupted);return isInterrupted(false);}
public static boolean interrupted() {// private native boolean isInterrupted(boolean ClearInterrupted);return currentThread().isInterrupted(true);}

中断指的是将线程当前状态打一个中断的标记,而不是真的中断当前线程

public class ThreadInterrupt {public static void main(String[] args) {Thread t1 =new Thread(() -> {while (true) {try {Thread.sleep(10);} catch (InterruptedException e) {System.out.println("收到打断信息。。。");}}});t1.start();System.out.println(t1.isInterrupted());t1.interrupt();System.out.println(t1.isInterrupted());}
}

虽然调用了interrupt方法,但是由上图可知,当前线程并没有结束

对wait状态的线程调用interrupt

public class ThreadInterruptWait {public static final Object MONITOR = new Object();public static void main(String[] args) {Thread t1 =new Thread(() -> {while (true) {synchronized (MONITOR) {try {MONITOR.wait();} catch (InterruptedException e) {System.out.println("接收到中断信息。。。");}}}});t1.start();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(t1.isInterrupted());t1.interrupt();System.out.println(t1.isInterrupted());}
}

优雅的关闭线程

通过设置标识位进行关闭
public class ThreadCloseGracefully {private static class Worker extends Thread {private volatile boolean start = true;@Overridepublic void run() {while (start) {System.out.println("worker is running...");}}public void shutdown() {this.start = false;}}public static void main(String[] args) {Worker worker = new Worker();worker.start();try {Thread.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}worker.shutdown();}
}

通过interrupt中断线程
public class ThreadCloseGracefully2 {private volatile static int i = 0;private static class Worker extends Thread {@Overridepublic void run() {while (true) {try {Thread.sleep(10);System.out.println("worker is running..."+i++);} catch (InterruptedException e) {break;}}}public static void main(String[] args) {Worker worker = new Worker();worker.start();try {Thread.sleep(1_000);} catch (InterruptedException e) {e.printStackTrace();}worker.interrupt();while (worker.isInterrupted()) {System.out.println("worker 在 interrupt之后还在运行");}}}
}

interrupt是可以中断线程的,但是不是调用之后,线程马上就停止!

线程的interrupt相关推荐

  1. JAVA线程的interrupt

    interrupt()只是改变中断状态而已. interrupt()不会中断一个正在运行的线程.这一方法实际上完成的是,给受阻塞的线程抛出一个中断信号,     这样受阻线程就得以退出阻塞的状态.更确 ...

  2. 调用方法try起来的好处_Java:一个重要的停止线程方法——interrupt

    一.前言 之前本人写了一篇防止Controller中的线程被重复调用的文章,大概代码如下: //sonarqube检查要求static变量必须是final,为避开检查,使用final HashMapp ...

  3. 关于线程的interrupt与sleep问题

    关于线程的interrupt与sleep问题 目录 关于线程的interrupt与sleep问题 情况一:自定义线程中写interrupt与sleep 所以以后要用这种方法结束线程,编码时是先写int ...

  4. 线程中断interrupt

    线程中的中断标志位 一. 与线程中断有关的3个方法: interrupt():中断线程,改变其线程的中断标志位(仅仅只有一个通知的作用),但是否中断由自己线程判断决定.false-->true ...

  5. 怎么查看线程的状态及interrupt优雅的关闭线程和interrupt()、interrupted()、isInterrupted()的作用以及区别在哪?

    怎么查看线程状态 jps指令查看我当前的进程ID jstack 线程ID 示例: public class StatusDemo {public static void main(String[] a ...

  6. 线程中断机制 interrupt、isInterrupted、interrupted方法

    ①. 什么是中断 ①. 一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,所以,Thread.stop.Thread.suspend.Thread. resume都已经被废弃了 ② ...

  7. 线程中断 interrupt

    Java的中断是一种协作机制.也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己.每个线程都有一个boolean的中断状态(这个状态不在 ...

  8. java 中断线程 wait_Java 线程中断(interrupt)与阻塞 (park)的区别

    很多Java开发人员(包括我),尤其是刚进入软件行业的新手,认为Java设置线程中断就是表示线程停止了,不往前执行了, Thread.currentThread().interrupt() 其实不是这 ...

  9. java线程interrupt用法_Java线程中interrupt那点事 | 学步园

    1.先看一下例子程序: import java.io.IOException; import java.net.ServerSocket; import javax.rmi.CORBA.Tie; /* ...

最新文章

  1. 生命的礼赞,请记住我的名字,我叫科比-布莱恩特
  2. Android视频压缩并且上传
  3. mysql中char,varchar,text
  4. vijos p1143(三取方格数)(100)
  5. Chaincode for Operators(运营商的链码手册)
  6. 成吉思汗的子孙:中国游牧蒙古人
  7. 推荐一款接口自动化测试数据提取神器 JSonPath
  8. 堆栈和内存分配[转]
  9. 音乐网站搭建源码Sourcecode
  10. 三维城市建筑模型生产工具《geobuilding1.0》2022.03.25
  11. 具有催眠作用的螺旋图
  12. 五、 Usb setting 中tethering 设置流程
  13. 数据基础---《利用Python进行数据分析·第2版》第11章 时间序列
  14. 喷淋系统在安装算量软件中如何计算工程量?
  15. sdk没有登录什么意思_SDK登录与支付流程图文教程
  16. 【工具】JS脚本|网页任意视频倍速播放(包括MOOC、本地视频、其他的视频)
  17. 欧美软件外包三种模式
  18. AI中怎么给文字加粗
  19. unity2022打开项目时报Fatal error显示无权访问d3dcompiler_47.dll, 解决方法很简单-还有ucrtbase.dll问题
  20. 关于sql语句中where条件内添加case when的问题

热门文章

  1. 奔驰官宣明年释放“过渡版”L3,允许激活≠安全可靠
  2. JumpServer 堡垒机
  3. opencv图像处理浮雕效果
  4. 终于摸透了iPhone闹钟用法,别放那里浪费了
  5. 3、序列化(什么是 java 序列化?什么情况下需要序列化?)
  6. 一文搞懂电力系统调度数据网4+1+1区
  7. oracle 公共dblink,Oracle private dblink和pubic dblink
  8. Android复习指南
  9. 预处理指令define和undef
  10. python贝叶斯分类器_朴素贝叶斯分类器的简单Python实现