【学习笔记-并发编程实战】第7章 取消与关闭

任务取消

取消任务,就是取消关闭线程咯。为什么要关闭线程呢,大概有几种原因,1用户主动取消,2有时间限制的操作,说白了就是超时,3应用程序事件,一个线程执行完了,已经完成了既定的任务,这时其他的线程,当然也不需要再继续进行,4错误,5关闭,一个程序或者服务需要关闭时。

中断

java中没有语义的关闭或结束的方法,只有一个协调机制,中断。个人理解相当于是一个中断标志,线程在执行某些操作前会检查这个标志位,如果中断标志位true则进行相关退出操作。三个方法interrupt()为中断通知操作即将标志位设为true,isInterrupted()返回当前标志位的状态,interrupted()清除中断状态(置位false),返回之间的值。

中断策略

发现中断后,线程如何处理中断,保存状态、结束运行、抛出异常等。每个线程都有各自的中断策略,除非你知道线程的中断策略,否则就不应该中断近这个线程。

响应中断

响应中断有两种实用的策略,1传递异常,直接抛出异常,让上层代码进行处理,这样相当于自己写的代码也成为了可响应中断的阻塞方法,2恢复中断状态,如果你的代码没有实现中断策略,那么就需要上上层代码知道中断信息,对于一些不支持取消但可以调用可阻塞方法的操作,可以保存一个本地中断状态,当操作完成后再恢复中断状态,P118。

计时运行

P119中通过调用一个方法来执行中断,由于不清楚在哪里调用这个方法,相当于是不清楚调用线程的中断策略,所以无法保证调用线程的安全。这一小节没怎么看懂,先打个标记!!!

通过Future来实现取消

可以通过future的cancel来取消任务,其中的参数true和false对应的运行中的任务的不同取消方式,true直接取消,false让其继续运行,取消其他未开始运行的。

处理不可中断的阻塞

对应因为获取内置锁而阻塞的线程,只能通过设置中断状态来中断,而对于不能响应中断的阻塞线程,则只能通过其他的类似于中断的方法来终止线程。(通过将这种方法进行封装作为非标准的取消方法)

采用newTaskFor来封装非标准的取消

通过封装ThreadPoolExecutor和CancellableTask来实现非标准的取消操作,提高取消操作的响应性。详见P123,还需要结合其他的文章详细了解下。

 

停止基于线程的服务

应用程序拥有服务,服务拥有线程,如果服务的生命周期大于线程的生命周期,那么就应该提供停止线程的方法。如Executor。

日志服务

日志由单独的线程进行处理,调用日志服务相当于生产者,如果消费者日志处理线程需要关闭了,此时生产者仍然想要写入日志,就会发生问题。所以对日志调用服务进行封装,在日志服务关闭后,不在接受日志调用服务。

关闭ExecutorService

shutdown正常关闭,已经执行的等待执行完毕,没有执行的不再执行,shutdownNow立即关闭,没有执行的不再执行,正在执行的取消执行。

“毒丸”对象

在无界队列中,通过向队列中放入一个特定的对象,当消费者获取到这个特定对象后,开始关闭服务。

只执行一次的服务

在方法内部使用一个Executor,将需要执行的所有任务提交,在最后关闭executor即可。见P130。

shutdownNow的局限性

服务关闭后,没有执行的任务可以返回,但是已经执行到中途的任务却没有了,所以需要对executor进行封装,确保知晓哪些是没有完成执行的任务。

 

处理非正常的线程终止

单线程运行的任务,如果异常终止,我们能够很清楚的判断。如果是多线程的话,可能不会被轻易的发现,我们可以通过监测程序来发现异常。所以在调用代码的时候应该多思考一个会不会,会不会发生异常导致程序停止等故障。

未捕获的异常处理

遍写一个线程的异常处理器,当线程发生异常后,能够通过这个处理器来响应线程,譬如重新启动线程、关闭应用程序或者执行其他的修复等。

 

JVM关闭

强行关闭和正常关闭,正常关闭如System.exit,或其他Ctrl-C等方式

关闭钩子

在关闭JVM之前,会先执行已经注册好但尚未开始的钩子线程,可以进行一些任务的结束关闭服务,由于关闭钩子是通过子线程并发执行的,所以关闭钩子应该是线程安全的。为了避免死锁,关闭钩子不应该去关联其他钩子会使用到的资源,所以最好是只使用一个关闭钩子,通过串行执行的方式,避免一些可能会发生的故障。

守护线程

JVM启动时除了主线程其他的是守护线程,主线程创建的新线程,默认是普通线程。JVM关闭时,将所有存在的守护线程抛弃,不去执行相关的finally操作,所以不要在守护线程中执行IO有关的操作任务。

终结器

finalize方法,在回收器释放线程后会调用它,不确定在何时运行,而且有巨大性能开销,避免使用终结器。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值