首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

并发编程实战-第7章

序文:

如果你没有时间阅读这本,那你就来对地方了。小编会将每一章刨去废话,取其精华。分享给大家。如果觉得可以请不要忘了关注小编。我会定期跟新java 中的经典书籍。

正文:

第7章:取消和关闭 (如何让线程安全可靠的停下来)

1.为什么要考虑这个:

有些任务是可以用户取消的,比如一些下载是可以取消的.

所以一些耗时的处理要考虑到用户的取消操作.

一些操作会设置超时时间,不会无条件执行下去.

2.java中没有提供任何机制来安全地终止线程.只有协作机制:

协作机制:并不是立即停止,而是发出一请求(或者改变成中断状态,等待检测),被这种协作机制要求中断的线程,不一定就能响应这个请求.

缺点就是慢,有点也是慢(因为这样可以保证一些正在操作的共享数据的一致性)

3.优秀的软件能很完善地处理失败,关闭和取消等过程.

4.任务取消:

外部代码在某个操作完成之前能将其状态置为"完成状态" ,那么这个操作就可以称为可取消的.

5.简单的协作机制取消:

用一个while 循环判断一个 volatile变量时否满足某个条件,如果满足则 循环停止

上面的取消机制存在很多问题,当while 循环中调用一个阻塞方法,一旦阻塞,那么就永远无法停止.

6.中断(Interrupt)

前面讲过一般会用InterruptedException 来标志阻塞方法.(就是考虑到要中断阻塞方法)

一些特殊的阻塞库的方法是支持中断的.(既这个方法阻塞以后调用中断,可以取消这个方法的阻塞)

每个线程(Thread)都有一个boolean 类型的中断状态.(线程中断时设置为true)

其中线程(Thread)的一些方法就是与这个变量有关,interrupt(中断目标线程) isInterrupted(返回目标线程的中断状态) ,静态方法interrupted(清除当前线程的中断状态-清除中断线程状态的唯一方法)

Thread.sleep() 方法会检查线程何时中断,(在睡眠的时候可以被中断打断,这时会抛出InterruptedException并清除中断状态)

interrupt 并不是立即停止目标线程正在进行的工作,只是传递请求中断的消息.

7.中断时实现取消的最合理方法.

8.大多数的阻塞库方法的中断响应就是抛出一个InterruptedException:这样可以快速退出执行流程,并把中断信息传递给调用者,从而由上一层代码进一步采取处理.( 实现中断的最佳方法)

9.通常可中断的方法一般会在阻塞或者重要耗时的工作前检查,中断状态,从而可以尽快的响应中断.

10.通过future来实现取消:

Future类带有cancel方法.

11.处理不可中断的阻塞:

例如:一些同步的socket 操作,如果想要中断,需要关闭底层的套接字

登录获取锁的时候阻塞,(Lock 类中提供了lockInterruptibly 使在等一个锁的同事任能响应中断)

12.jvm 关闭:

强行关闭:调用Runtime.halt 或者操作系统杀死jvm进程

正常关闭:最后一个非守护线程结束,调用system.exit

jvm 停止时候所有任然存在的守护线程将被抛弃(不会执行finally代码块)

13.关闭钩子:

正常关闭中,jvm 首先调用所有已经注册的关闭钩子(Runtime.addShutdownHook 注册的钩子线程)

强行关闭时,不会运行关闭钩子

关闭钩子应该是线程安全的,所以写的时候要注意

要经可能快的退出,会影响jvm 的退出。

14.守护线程&普通线程:

除了主线程外其他的线程都是守护线程

主线程创建的所有线程都是普通线程

15.finalize 、终结器 :避免使用。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190213A11GNH00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券