网站大量收购闲置独家精品文档,联系QQ:2885784924

讲如何正确停止线程volatile标记位方法错误海量资源.pdfVIP

讲如何正确停止线程volatile标记位方法错误海量资源.pdf

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

kay5620 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8001056127000014

1亿VIP精品文档

相关文档