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

两阶段终止模式如何优雅地线程.pdfVIP

  1. 1、本文档共9页,可阅读全部内容。
  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文档。上传文档
查看更多

35-两阶段终止模式:如何优雅地终止线程?段终式:如雅地线程?

前面两篇文章我们讲述的内容,从纯技术的角度看,都是启动多线程去执行一个异步任务。既启动,那又该

如何终止呢?今天咱们就从技术的角度聊聊如何优雅地止

终止线程,正所谓有始有终。

在《09 | Java线程(上):Java线程的生命周期》中,我曾讲过:线程执行完或者出现异常就会进入终止状

态。这样看,终止一个线程看上去很简单啊!一个线程执行完自己的任务,自己进入终止状态,这的确很简

单。不过我们今天谈到的“优雅地终止线程”,不是自己终止自己,而是在一个线程T1中,终止线程T2;

这里所谓的“优雅”,指的是给T2一个机会料理后事,而不是被一剑封喉。

Java语言的Thread类中曾经提供了一个stop()方法,用来终止线程,可是早已不建议使用了,是这个方

法用的就是一剑封喉的做法,被终止的线程没有机会料理后事。

既然不建议使用stop()方法,那在Java领域,我们又该如何优雅地终止线程呢?

终止模式

如何理解两阶段终止模式

两段止式

前辈们经过认真对比分析,已经总结出了一套成方案,叫做两阶段终止模式。顾名思义,就是将终止过

1向线程T2发送止令2应终

程分成两个阶段,其中第一个阶段主要是线程T发送终止指令,而第二阶段则是线程T响应终止

指令令。

两阶段终止模式示意图

那在Java语言里,终止指令是什么呢?这个要从Java线程的状态转换过程说起。我们在《09 | Java线程

(上):Java线程的生命周期》中曾经提到过Java线程的状态转换图,如下图所示。

Java中的线程状态转换图

从这个图里你会发现,Java线程进入终止状态的前提是线程进入RUNNABLE状态,而实际上线程也可能处在

休眠状态,也就是说,我们要想终止一个线程,首先要把线程的状态从休眠状态转换到RUNNABLE状态。如

interrupt()方法,它可以将休眠状态的线程转换到RUNNABLE状

何做到呢?这个要靠Java Thread类提供的nterrupt()方

态。

线程转换到RUNNABLE状态,我们如何再将其终止呢?RUNNABLE状态转换到终止状态,优雅的方式是

让Java线程自己执行完 run() 方法,所以一般我们采用的方法是设置一个标志位设一标志,然后线程会在合适的时机

检查这个标志位,如果发现符合终止条件,则自动run()方法。这个过程其实就是我们前面提到的第二

响应终止指令。

阶段:响应止令

综合上面这两点,我们能总结出终止指令,其实包括两方面内容:interrupt()方法nterrupt()方和线程终止的标志位程终的志。

理解了两阶段终止模式,下面我们看一个实际工作中的案例。

终止操作

用两阶段终止模式终止操作

实际工作中,有些系统需要动态地一些数据,一般都是系统发送指令给被系统的

,接收到指令,从目标收集数据,然后回传给系统,详细过程如下图所示。出于

对性能的考虑(有些项对系统性能影响很大,所以不能一直持续),动态功能一般都会有终止

操作。

动态功能示意图

class {

boolean started = false;

//线程

Thread rptThread;

//启动功能

synchronized void start(){

//不允许同时启动多个线程

文档评论(0)

136****1820 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档