第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 终结器


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

相关文章推荐

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

Java没有提供某种抢占式的机制来取消操作或结束线程。 可以通过协作式的中断机制来实现取消操作。 可以使用FutureTask和Executor框架,构建可以取消的任务和服务。

第7章 启动和关闭Greenplum数据库

在Greenplum数据引擎数据库管理系统,数据库服务器实例(主机和所有段)启动或以这样的方式,他们可以作为一个统一的数据库管理系统一起工作的所有系统的主机停止。 因为一个Greenplum数据系统...

Jersey 2.22.2 官方文档第7章学习笔记

文档地址:https://jersey.java.net/documentation/latest/representations.html#d0e6665 记录了7.2,7.3学习笔记。 ...

第7章--继承

  • 2017-07-31 19:58
  • 5.07MB
  • 下载

com技术组件第7章,用vs2005编译示例代码,com注册不成功。

com第7章,编译问题,解决方案
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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