取消和关闭

中断一个协作机制,使得一个线程能够另一个线程停止当前工作。
1.任务取消
当外部代码能够在活动自然结束之前,把他改成完成状态,这个活动被称为“可取消的”(cacnellable)。
原因:用户请求取消、限时活动、应用程序事件、错误、关闭(优雅关闭,强制关闭)。
取消策略(cancellation policy):一个可以取消的任务必须拥有取消策略。
中断
        阻塞类库的方法支持中断。
        每一个线程都有中断状态,在中断的时候,这个状态被设置为true。interrupt()中断目标线程,isInterrupted()返回目标线程的中断状态,interrupted()静态方法,清除目标线程的中断状态,并返回之前的值,是清除中断状态的唯一方法。
        Thread.sleep(1), object.wait() 视图检测线程何时被中断,并提前返回。对中断的响应表现为:清除中断状态,抛出interruptedException
        调用interrupt()并不意味着停止了目标线程当前的工作,它只是传递一个中请求中断的信息。
中断是实现取消最明智的选择。


中断策略
        当检查到中断请求的时候,任务并不需要放弃所有的事情。它可以选择推迟,直到更合适的时机。只要记得它被请求过中断,完成当前的任务,然后抛出interruptException。
        直接把中断传递给调用者。
        如果需要捕获interruptException,捕获之后应该通过Thead.currentThread.interrupt()恢复中断。
        因为每个线程都有自己的中断策略,所以你不应该中断线程,除非你知道这个中断对线程意味着什么
响应中断
        只有实现了线程中断策略的代码才可以接收中断请求,通用的目的任务和库代码绝不应该接收中断请求。
        有些活动不支持取消,但可能调用可中断的阻塞方法,那么它们必须在循环中调用这些阻塞方法,当发现中断后重新尝试,

通过Future来取消
处理不可中断的阻塞
使用newTask封装非标准取消
        2.停止基于线程的服务
线程的所有权是不能传递的。
服务应该提供生命周期方法。
关闭ExecutorService,shutDown和shutDownNow
致命药丸
shuttingdown的局限性
        3、处理反常的线程终止
未捕获的异常处理UncaughtExceptionHandler,需要提供ThreadFactory给ThreadPoolExecutor的构造函数。execute()和submit()的区别


       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值