美文网首页
两阶段终止模式

两阶段终止模式

作者: zhengqiuliu | 来源:发表于2019-07-31 22:03 被阅读0次

一个线程执行完自己的任务,自己就会进入终止状态。但是如果使用一个线程T1,终止线程T2,如何优雅的终止线程。优雅指的是可以给T2一个机会料理后事,而不是一剑封喉。

Java语言曾经使用stop方法终止线程,可是早已不建议使用,原因是这个方法用的就是一剑封喉的做法,被终止的线程没有机会料理后事。

如何理解两阶段终止模式

这里终止过程分成两个阶段:一阶段主要是线程T1向线程T2发送终止指令,二阶段就是线程T2响应终止指令。

例子:用两阶段终止模式终止监控操作

实际工作中,有些监控系统需要动态地采集一些数据,一般都是监控系统发送采集指令给被监控系统的监控代理,监控代理接收到指令之后,从监控目标收集数据,然后回传给监控系统。

动态采集功能一般都会有终止操作。监控代理简化之后的实现,start()方法会启动一个新的线程rptThread来执行监控数据采集和回传的功能,stop方法需要优雅地终止线程rptThread,那stop相关功能该如何实现呢?

对于线程池如何优雅的终止?

线程池提供了两个方法:shutdown() 和 shutdownNow(). 

shutdown()方法是一种很保守的关闭线程池的方法。线程池执行shutdown()后,就会拒绝接收新的任务,但是会等待线程池中正在执行的任务和已经进入阻塞队列的任务都执行完之后才最终关闭线程池。

shutdownNow()方法,就相对激进一些了,线程池执行shutdownNow()后,会拒绝接收新的任务,同时还会中断线程池中正在执行的任务,已经进入阻塞队列的任务也被剥夺了执行的机会。如果提交到线程池的任务不允许取消,那就不能使用shutdownNow()方法终止线程池。不过如果提交到线程池的任务允许后续以补偿的方式重新执行,也是可以使用shutdownNow()方法来终止线程池的。

相关文章

网友评论

      本文标题:两阶段终止模式

      本文链接:https://www.haomeiwen.com/subject/nvpxdctx.html