关于线程中断thread interrupt

在多线程编程中经常会遇到需要中止线程的情况,比如启动多个线程去数据库中搜索,如果有一个线程返回了结果,其他线程就可以取消了(Thread.stop()已经建议不要再使用)

1.通过成员方法Thread.interrupt()来设置中断状态为true
2.通过成员方法Thread.isInterrupted()来获取中断状态
3.通过静态方法Thread.interrupted()来获取中断状态,并且清除中断状态(当然获取的是清除之前的值),也就是说连续两次调用此方法,第二次一定会返回false,当然也有例外,具体看文档。

通常可以通过如下示例代码来控制线程退出,

public void run()
{
while(flag)
{
//执行的代码
} } 

flag为false时线程停止。。。

下面测试线程被中断后的情况

public class ThreadInterruptTest {
public static void main(String[] args) {
Thread subThread = new Thread(new Runnable() { @Override public void run() { boolean flag = false; while (!flag) { System.out.println(".....子线程运行中......"); try { Thread.sleep(1000); } catch (InterruptedException e) { // Thread.currentThread().interrupt(); flag = Thread.interrupted(); }
} System.out.println("子线程退出"); } });
subThread.start();
//主线程休息3s
try { Thread.sleep(3000);
} catch (InterruptedException e) { e.printStackTrace();
} subThread.interrupt(); //中断子线程
} }

运行上面的程序,会发现即便主线程调用了interrupt方法,子线程检测到异常后发现中断状态没有被置为true,导致循环不能退出,子线程不能退出,但是静态方法Thread.interrupted()的注释说: @return true if the current thread has been interrupted;false otherwise.

后来在Doug lea的书中找到了答案,根据规范,这是因为在sleep方法睡眠后,如果检测到InterruptedException异常被抛出,中断状态会被重新置为false,具体可能要看openjdk的c源码,后来我在The Java Language Specification也找到了相关的描述,If thread t is interrupted, an InterruptedException is thrown and t's interruption status is set to false.

如果我们处理完InterruptedException异常后需要保持并传递该中断状态的话只要再次调用Thread.currentThread().interrupt(),将中断状态置为true就好了,也就是上面注释掉的那一句

ps:参考Java并发编程:设计原则与模式

关于线程中断thread interrupt相关推荐

  1. 线程中断:interrupt、interrupted、isInterrupted

    Java中的线程: 提示:我们应该都知道在Java中通过Thread类来实现多线程的操作,但实际上线程是操作系统的最小执行单元,java中的Thread实例实际是与操作系统中线程做了一个映射,即一个T ...

  2. Java的Interrupt与线程中断

    中断状态 每一个线程都有一个boolean属性,表示中断状态,初始值为false. 中断线程:Thread.interrupt() 正常情况下,只是将线程的中断状态变为true.线程中可以通过轮询中断 ...

  3. java io中断_Java的Interrupt与线程中断

    中断状态 每一个线程都有一个boolean属性,表示中断状态,初始值为false. 中断线程:Thread.interrupt() 正常情况下,只是将线程的中断状态变为true.线程中可以通过轮询中断 ...

  4. 线程中断 interrupt

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

  5. 【Java并发编程】之二:线程中断

    [Java并发编程]之二:线程中断 使用interrupt()中断线程 ​ 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一 ...

  6. JAVA多线程:守护线程 setDaemon全方位剖析| 守护线程是线程吗 |thread.isAlive()反思(五)

    前言 本文目的,通过短小精悍的实例,让你在最短时间,全面揭晓 thread.setDaemon(true)守护线程的使用,及其使用场景.一看就懂,一学就会! 概述 守护线程的作用 用来让其(这里暂称之 ...

  7. Android Thread interrupt 中断JAVA线程(转)

    转载自:http://hi.baidu.com/%E3%C6%CE%C4%B7%E5/blog/item/d8959f1b6716c8168618bfbb.html 假如我们有一个任务如下,交给一个J ...

  8. java 线程池 中断_如何中断(interrupt)线程(thread)(线程池的线程中断我的理解是一个意思)...

    1.概述基本实现是,通过 InterruptedException 异常来终止程序,至于线程什么时候终止,只能由jvm来决定了,若理解的不到位,欢迎大牛们指点 2.code 如下 package co ...

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

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

最新文章

  1. 那些伤害不大,侮辱性极强的瞬间
  2. 零基础python从入门到精通 pdf-跟老齐学Python:从入门到精通PDF电子版
  3. (二叉树的遍历)Tree UVa 548
  4. Android之使用AlertDialog.Builder类创建带列表的对话框和带自己所布局视图的对话框
  5. Linux服务器集群系统(四)——LVS集群的负载调度
  6. @sql 单元测试_SQL单元测试:使用异常
  7. centos7建站php_Centos7PHP环境搭建
  8. 利用unlocker在VMware里解锁macOS操作系统
  9. haneWIN NFS Server|haneWIN NFS Server(优秀NFS服务器)V1.2.16官方版-绿色下载吧
  10. tableau两个不同的图合并_tableau两个不同的图合并_Tableau数据源详解
  11. Poco库学习——1
  12. 一个如何在bash中使用getopts的例子
  13. excel从身份证号码中获取邮编信息?
  14. 《金蝶ERP-K/3完全使用详解》—— 导读
  15. 服务器系统盘划分,服务器硬盘分区的划分c区系统区.doc
  16. cup过高是什么意思_cpu占用率过高是什么原因
  17. 让自己学会有效管理时间
  18. 去广告神器——李跳跳
  19. Ubuntu 微信 linux版最新可用——UOS魔改版
  20. python大数快速判断质数与分解质因数

热门文章

  1. 2019年全国电子设计大赛综合测评感悟
  2. 图像数据增强及其对应的标签扩充
  3. Adam和学习率衰减(learning rate decay)
  4. Matthew Ball:为什么说AR/VR元宇宙是Meta和苹果的下一个战场?
  5. CAD二次开发:用C#在AutoCAD中插入栅格图像
  6. 自动化测试框架结构图
  7. PHP+Mysql—留言管理系统网站(前端+后端、整套源码)
  8. Android 动态申请应用权限
  9. 微信语音技术原理_干货 | 2 分钟论文:语音生成表情包背后的技术原理
  10. 数据、数据库、数据库管理系统、数据库系统的概念