第7章 取消与关闭

原创 2016年06月01日 00:30:38

第7章 取消与关闭

7.1 任务取消

7.1.1 中断

在Java的API或语言规范中,并没有将中断与任何取消语义关联起来,但实际上,如果在取消之外的其他操作中使用中断,那么都是不合适的,并且很难支持起更大的引用。

每个线程都有一个boolean类型的中断状态。当中断线程时,这个线程的中断状态将被设置为true.在Thread中包含了中断线程以及查询线程中断状态的方法。

Interrupt方法能中断目标线程。

isInterrupted方法将能返回目标线程的中断状态。

interrupted方法将清除当前线程的中断状态,并返回它之前的值,这也是清除中断状态的唯一方法。

*Thread中的中中断方法

public class Thread {

    public void interrupt() { ...}

    public boolean isInterrupted() {...}

    public static boolean interrupted() {...}

    ...

}

调用interrupt并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息。

在使用静态的interrupted时应该小心,因为它会清除当前线程的中断状态。如果在调用interrupted时返回了true,那么除非你想屏蔽这个中断,否则必须对它进行处理——可以抛出InterruptedException,或者通过再次调用interrupt来恢复中断状态。

通常,中断是实现取消的最合理方式。

7.1.2 中断策略

由于每个线程都拥有各自的中断策略,因此除非你知道中断对该线程的含义,否则不应该中断这个线程。

7.1.3 响应中断

当调用可中断的阻塞函数时,有两种实用策略可用于处理InterruptedException:

*传递异常(可能在执行某个特定于任务的清除操作之后),从而使你的方法也成为可中断的阻塞方法。

*恢复中断状态,从而使调用栈中的上层代码能够对其进行处理。

7.1.4 示例:计时运行

7.1.5 通过Future来实现取消

ExecutorService.submit将返回一个Future来描述任务。Future拥有一个cancel方法,该方法带有一个boolean类型的参数mayInterruptIfRunning,表示取消操作是否成功。

如果mayInterruptIfRunning为true并且任务当前正在某个线程中运行,那么这个线程能被中断。

如果这个参数为false,那么意味着“若任务还没有启动,就不要运行它”

7.1.6 处理不可中断的阻塞

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

7.2 停止基于线程的服务

7.2.1 示例:日志服务

7.2.2 关闭ExecutorService

ExecutorService有两种关闭方法:使用shutdown正常关闭,以及使用shutdownNow强行关闭。

7.2.3 ”毒丸“对象

7.2.4 示例:只执行一次的服务

7.2.5 shutdownNow的局限性

7.3 处理非正常的线程终止

7.4 JVM关闭

7.4.1 关闭钩子

7.4.2 守护线程

7.4.3 终结器


版权声明:本文为博主原创文章,未经博主允许不得转载。

ACCPHTMLS1第七章上机练习1

无标题文档 li{ list-style-type:none; width:100px; float:left; } a{ background:url(../Desktop/forumMenu...
  • baidu_36074048
  • baidu_36074048
  • 2016年10月19日 14:58
  • 690

javascript语言精粹笔记 5-7章

继承基于类的语言中,继承有两个好处 1、代码重用。2、包括了一套类型系统的规范。 js是基于原型的弱类型语言,它可以模拟基于类的模式,也可以用其他模式。伪类js不让对象直接从其他对象继承,反而插入...
  • kofforever
  • kofforever
  • 2017年02月08日 11:48
  • 94

C++Primer第五版 第七章习题答案(1~10)

1:知识点1:类的定义方法:struct和class两种方法的用法和区别。 知识点2:类内成员的初始化方法:成员初始化列表。编译器会调用构造函数初始化成员,可以被重载。 首先举个例子方便于理解: ...
  • misayaaaaa
  • misayaaaaa
  • 2017年02月16日 08:52
  • 3601

C++沉思录读书笔记(7章)-句柄:第二部分

上一回讨论的句柄技术有一个明显的缺点:为了将句柄捆绑到类T的对象上,必须要新定义一个具有类型为T的成员对象的新类。 这个毛病相当麻烦,如果想新设计一个类的句柄类,就需要新定义两个类。 ...
  • yucan1001
  • yucan1001
  • 2011年10月30日 22:12
  • 676

第七章 7.3.2节练习

练习7.27 给你自己的Screen类添加move、set和display函数,
  • chxw098
  • chxw098
  • 2014年10月19日 22:58
  • 710

Java并发编程实战 - 第7章 取消与关闭

Java没有提供某种抢占式的机制来取消操作或结束线程。 可以通过协作式的中断机制来实现取消操作。 可以使用FutureTask和Executor框架,构建可以取消的任务和服务。...
  • mrszsongzi
  • mrszsongzi
  • 2017年04月23日 23:38
  • 102

《道德经》第七章

天長地久。天地所以能長且久者,以其不自生,故能長生。 是以圣人后其身而身先;外其身而身存。非以其無私邪?故能成其私。 【易解】 天长地久。天地所以能够长久,是因为它们不去强求一种非其不可的...
  • tskpcp
  • tskpcp
  • 2017年02月13日 10:16
  • 118

深入理解Java虚拟机JVM高级特性与最佳实践阅读总结—— 第七章 虚拟机类加载机制

类加载机制,将描述类的class文件加载到内存,并对数据进行校验、转换接卸、初始化,最终形成尅被虚拟机直接使用的Java数据类型 Java中,类型的加载、连接、初始化都是在程序运行期间完成,动态加载和...
  • sagwsagw
  • sagwsagw
  • 2017年03月01日 11:44
  • 181

[深入理解Java虚拟机]第七章 类加载的过程

接下来我们详细讲解一下Java虚拟机中类加载的全过程,也就是加载、验证、准备、解析和初始化这5个阶段所执行的具体动作。加载“加载”是“类加载”(Class Loading)过程的一个阶段,希望读者没有...
  • qilixiang012
  • qilixiang012
  • 2015年10月24日 19:19
  • 562

c++ Primer Plus(第六版)第七章习题,写代码之路

c++ Primer Plus(习题7.1) //用户输入啷个数,返回调和平均数 //其中一个为0结束程序 #include using namespace std; double t_averag...
  • Robot_x
  • Robot_x
  • 2017年01月20日 11:53
  • 401
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:第7章 取消与关闭
举报原因:
原因补充:

(最多只允许输入30个字)