码迷,mamicode.com
首页 > 编程语言 > 详细

java并发编程实战学习笔记之取消与关闭

时间:2015-12-12 00:09:31      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:sleep   java   检测   接口   

第七章 取消与关闭

7.1 任务取消

方式一、通过volatile类型的域来保存取消状态

方式二、interrupt()方法

interrupt()可以中断目标线程

isinterrupted()方法用来检测目标线程的中断状态

interrupted()用于清除中断状态,并且返回之前的中断状态,这是唯一可以清除中断状态的方法,如果在调用该方法是返回了true,那么除非你想屏蔽这个中断,否则你必须对他进行处理,可以抛出interruptExeption异常或者重新通过interrupt来恢复中断状态

sleep(),wait(),join()会在发现中断时提前返回,并且返回interruptException异常,并清除中断状态,

响应中断的方法:

  • 如果遇到的是可中断的阻塞方法抛出InterruptedException,可以继续向方法调用栈的上层抛出该异常,如果是检测到中断,则可清除中断状态并抛出InterruptedException,使当前方法也成为一个可中断的方法。

  • 若有时候不太方便在方法上抛出InterruptedException,比如要实现的某个接口中的方法签名上没有throws InterruptedException,这时就可以捕获可中断方法的InterruptedException并通过Thread.currentThread.interrupt()来重新设置中断状态。如果是检测并清除了中断状态,亦是如此。

一般的代码中,尤其是作为一个基础类库时,绝不应当吞掉中断,即捕获到InterruptedException后在catch里什么也不做,清除中断状态后又不重设中断状态也不抛出InterruptedException等。因为吞掉中断状态会导致方法调用栈的上层得不到这些信息。

当然,凡事总有例外的时候,当你完全清楚自己的方法会被谁调用,而调用者也不会因为中断被吞掉了而遇到麻烦,就可以这么做。

总得来说,就是要让方法调用栈的上层获知中断的发生。假设你写了一个类库,类库里有个方法amethod,在amethod中检测并清除了中断状态,而没有抛出InterruptedException,作为amethod的用户来说,他并不知道里面的细节,如果用户在调用amethod后也要使用中断来做些事情,那么在调用amethod之后他将永远也检测不到中断了,因为中断信息已经被amethod清除掉了。如果作为用户,遇到这样有问题的类库,又不能修改代码,那该怎么处理?只好在自己的类里设置一个自己的中断状态,在调用interrupt方法的时候,同时设置该状态,这实在是无路可走时才使用的方法。

    如果任务不响应中断怎么办?    通过join设置延迟来解决。

通过future来实现取消

    如何取消不可中断的阻塞?    重写interrupt方法


7.2 停止基于线程的服务

线程的停止应该由它的拥有者来执行

    


java并发编程实战学习笔记之取消与关闭

标签:sleep   java   检测   接口   

原文地址:http://muyunzhe.blog.51cto.com/9164050/1722206

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!