内容简介:在基于上面的理由,Java提供了新的中断机制(interrupt),其他线程调用想要终止线程的被调用线程不处于阻塞的时候,需要调用方法来监控标志.
合理中断线程
合理中断
在 Thread
类中,提供了 stop()
, suspend()
和 resume()
方法,这三个方法分别是用来结束,暂停,恢复线程. 但是都已经被标记为@Deprecated废弃了. 因为一个线程不应该由其他线程来结束,他应该收到别人的通知,然后自己在合适的位置结束,如果不合理的结束,会导致很多意外的结果,比如临界区还没完全操作完,提前释放锁,但是部分状态已经改变,还有没有做一些清理操作等等.
基于上面的理由,Java提供了新的中断机制(interrupt),其他线程调用想要终止线程的 interrupt()
方法. 这个时候线程会根据自己的状态做出响应:
InterruptedException
被调用线程处于阻塞状态
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { try { // 被调线程阻塞自己30s sleep(30000); } catch (InterruptedException e) { e.printStackTrace(); } } }; try { // 启动线程 thread.start(); // 主线程阻塞自己3秒 TimeUnit.SECONDS.sleep(3); // 中断线程 thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // java.lang.InterruptedException: sleep interrupted // ...
被调用线程处于正常运行
被调用线程不处于阻塞的时候,需要调用方法来监控标志.
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { while (!Thread.interrupted()) { System.out.println("我还稳得住..."); } } }; try { thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // 我能稳得住 // ...
该程序会在检测interrupt标志,如果发现interrupt标志设置为true,则会结束自己.
interrupted()和isInterrupt()的区别
区别: 是否会清除interrupt标志. isInterrupt()方法不会改变标志,而interrupted()方法会在检测的同时,如果发现标志为true,则会返回true,然后把标志置为false.
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { while (!Thread.interrupted()) { System.out.println("我还稳得住..."); } // :warning::warning:添加下面代码:warning::warning: System.out.println(Thread.interrupted()); } }; try { thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // 我还稳得住... // ...(省略) // false
上面实例说明Thread.interrupted()方法会在标志为true的情况下修改interrupted的标志.
public static void main(String[] args) { Thread thread = new Thread() { @Override public void run() { // :warning::warning:修改方法:warning::warning: while (!isInterrupted()) { System.out.println("我还稳得住..."); } System.out.println(Thread.interrupted()); } }; try { thread.start(); TimeUnit.SECONDS.sleep(3); thread.interrupt(); } catch (InterruptedException e) { e.printStackTrace(); } } // ↓ out ↓ // 我还稳得住... // ...(省略) // true
源码解析
通过观察源码可以看出interrupted方法最后会调用isInterrupted(true)方法,而传入的参数代表是否清除标志位. 可以看到isInterrupted(boolean)是一个本地方法,最终会通过C/C++来执行. 而isInterrupted()最后传入的参数为false,说明不清除标志位.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- [译] 通过实现 25 个数组方法来理解及高效使用数组方法
- AWK简单使用方法
- python 内置函数使用方法
- 栈和帧指针使用方法
- Golang Label使用方法
- c# – 为什么委托在静态方法中使用时不能引用非静态方法?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
白话机器学习算法
[新加坡] 黄莉婷、[新加坡] 苏川集 / 武传海 / 人民邮电出版社 / 2019-2 / 49.00元
与使用数学语言或计算机编程语言讲解算法的书不同,本书另辟蹊径,用通俗易懂的人类语言以及大量有趣的示例和插图讲解10多种前沿的机器学习算法。内容涵盖k均值聚类、主成分分析、关联规则、社会网络分析等无监督学习算法,以及回归分析、k最近邻、支持向量机、决策树、随机森林、神经网络等监督学习算法,并概述强化学习算法的思想。任何对机器学习和数据科学怀有好奇心的人都可以通过本书构建知识体系。一起来看看 《白话机器学习算法》 这本书的介绍吧!