中断在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. 安装R语言开发环境RStudio服务器版
  2. Linux的vi命令作用?
  3. 记ThoughtWorks面试失败之旅
  4. 深度linux引导安装,全程演示Linux Deepin 12.06安装过程
  5. C语言: GDB调试技术(一)
  6. mysql有状态无状态_k8s statefulSet 有状态应用和无状态应用区别
  7. 积德行善真的有用吗?
  8. 概率论在实际生活的例子_「收藏」不确定度是什么?两个例子让你清清楚楚
  9. 【无机纳米材料科研制图——Photoshop 0403】PS使用索套工具和魔棒工具框出选区
  10. 终端发送自己的短地址给协调器
  11. css3 文字高光划过,CSS3实现一束光划过图片、和文字特效
  12. Epicor ERP 学习笔记
  13. 1500个字给你讲透什么是分账系统
  14. The Fewest Coins(多重背包+完全背包)
  15. Order by 多条件排序
  16. c++ 左值 广义左值 右值 纯右值 将亡值
  17. maven添加sqljdbc4.jar,并引用
  18. KaTex数学公式编辑器相关
  19. sketch怎么转换成html,手稿秒变html的Sketch 2 Code
  20. 软件流程和管理(七):个人、激励和团队

热门文章

  1. 【博学谷学习记录】超强总结,用心分享|大数据之GROUPING
  2. window7 正式中文零售版(10.22版) 32位已提供下载,64位待更新
  3. 用html浮雕效果图,浮雕效果是怎么实现的_html/css_WEB-ITnose
  4. 秀姿势(sugata)
  5. Mysql数据库连接出现1129错误
  6. 5分钟商学院-个人篇-演讲能力
  7. hexo next主题为博客添加分享功能
  8. SAN环境中WWN,WWNN,WWPN的区别
  9. Ubuntu系统-安装谷歌输入法
  10. 名编辑电子杂志大师教程 | *.FLB文件怎么打开