- 1、本文档共11页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
本文由简悦SimpRead转码,原文地址
在本我们主要学习如何正确停止一个线程?以及为什么用volatile标记位的停止方法是错误的?
首先,我们来复习如何启动一个线程,想要启动线程需要调用Thread类的start()方法,并在run()方
法中定义需要执行的任务。启动一个线程非常简单,但如果想要正确停止它就没那么容易了。
原理介绍
通常情况下,我们不会手动停止一个线程,而是允许线程运行到结束,然后让它自然停止。但是依然会
有许多特殊的情况需要我们提前停止线程,比如:用户突然关闭程序,或程序运行出错重启等。
在这种情况下,即将停止的线程在很多业务场景下仍然很有价值。尤其是我们想写一个健壮性很好,能
够安全应对各种场景的程序时,正确停止线程就显得格外重要。但是Java并没有提供简单易用,能够
直接安全停止线程的能力。
为什么不强制停止?而是通知、协作
对于Java而言,最正确的停止线程的方式是使用
interrupt。但interrupt仅仅起到通知被停止线程的
作用。而对于被停止的线程而言,它拥有完全的自主权,它既可以选择立即停止,也可以选择一段时间
后停止,也可以选择压根不停止。那么为什么Java不提供强制停止线程的能力呢?
事实上,Java希望程序间能够相互通知、相互协作地管理线程,因为如果不了解对方正在做的工作,贸
然强制停止线程就可能会造成一些安全的问题,为了避免造成问题就需要给对方一定的时间来整理收尾
工作。比如:线程正在写入一个文件,这时收到终止信号,它就需要根据自身业务判断,是选择立即停
止,还是将整个文件写入成功后停止,而如果选择立即停止就可能造成数据,不管是中断命令发
起者,还是接收者都不希望数据出现问题。
如何用interrupt停止线程
while(!Thread.currentThread().isInterrupted()moreworktodo){
domorework
}
明白Java停止线程的设计原则,我们看看如何用代码实现停止线程的逻辑。我们一旦调用某个线
程的interrupt(),这个线程的中断标记位就会被设置成true。每个线程都有这样的标记位,当线
程执行时,应该定期检查这个标记位,如果标记位被设置成true,就说明有程序想终止该线程。回到源
码,可以看到在while循环体判断语句中,首先通过Thread.currentThread().isInterrupt()判断线程是
否被中断,随后检查是否还有工作要做。逻辑表示只有当两个判断条件同时满足的情况下,才会去
执行下面的工作。
我们再看看具体例子。
publicclassStopThreadimplementsRunnable{
@Override
publicvoidrun(){
intcount=0;
while(!Thread.currentThread().isInterrupted()count1000){
System.out.println(count=+count++);
}
}
publicstaticvoidmain(String[]args)throwsInterruptedException{
Threadthread=newThread(newStopThread());
thread.start();
Thread.sleep(5);
errupt();
}
}
在StopThread类的run()方法中,首先判断线程是否被中断,然后判断count值是否小于1000。这
个线程的工作内容很简单,就是打印0~999的数字,每打印一个数字count值加1,可以看到,线程
会在每次循环开始之前,检查是否被中断了。接下来在main函数中会启动该线程,然后休眠5毫秒后
立刻中断线程,该线程会检测到中断信号,于是在还没打印完1000个数的时候就会停下来,这种就属
于通过interrupt正确停止线程的情况。
sleep期间能否感受到中断
Runnablerunnable=()-{
intnum=0;
try{
文档评论(0)