要使线程安全,快速,可靠的停下来并不是一件容易的事情。java并没有提供任何机制来安全的终止线程。但是java提供了中断(interrupt)使一个线程可以终止另一个线程的当前工作

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

    interrupt()方法能中断目标线程。

    boolean isInterrupt()方法能返回目标线程是否中断的状态。

    static boolean interrupted() 将返回并清除线程当前的中断状态,这个也是清除线程中断状态的唯一方法。

  调用interrupt()方法并不意味着立即停止目标线程正在进行的工作,而只是传递了请求中断的消息。然后由线程在下一个合适的时机中断自己。

  中断策略

  每个线程都应该包含自己的终端策略,以响应中断状态。中断策略规定了线程如何响应中断请求-----当发现中断请求时应该做哪些操作,哪些工作单元对中断来说是原子的,以及以多块的速度相应中断。

  响应中断

  当调用可中断的阻塞函数时有两种使用策略可用于处理interruption异常

    1.传递异常,从而使你的方法也变成可中断的阻塞方法。

      传递异常只需要在方法外加上 throws interruptedException就可以了,

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

      可以调用interrupt()方法来恢复中断状态。

  二. 如果代码不会调用可中断的阻塞方法,那么仍然可以通过轮询当前线程中的中断状态来相应中断。

  通过Future实现取消

  调用ExecutorService.submit方法将返回一个future对象。

  Future.cancel(boolean b).可用于取消当前任务。若b设置为true,则表示若线程正在运行则中断,若设置为false,若还没有运行则不会运行,则表示若正在运行就不中断,还未运行就不在执行。返回值只是表示是否设置中断状态成功,而不是线程已经中断。

  处理不可中断的阻塞

  java.io包中的同步socket,io,可直接关闭底层socket套接字。

  java.io可关闭链路

  selector异步io可调用close或wakeup方法提前返回。

  关闭基于线程的服务

  应用程序通常创建拥有多个线程的服务。这些服务的生命周期通常比创建他们的方法要长,如果应用程序准备退出,那么服务拥有的线程也需要结束,因此服务应该提供生命周期方法,来关闭它自己以及它所拥有的线程。

  ExecutorService就提供了shutdown和shutdownnow两个方法来停止服务。shutdownnow方法会首先停止接受新的任务,然后关闭正在执行的任务,最后返回已经提交单还没有执行的任务。而shutdown方法会首先停止接受新的任务,然后等待队列中所有已经提交的任务完成,最后执行关闭。shutdownnow拥有更好的响应性但安全性较差。

  另一种关闭生产者---消费者服务的方式是使用毒丸对象。只有在生产者和消费者数量都已知的情况下才可以使用毒丸对象。并且只有在无界队列中毒丸对象才能正常的工作。而且当生产者和消费者数量都很大时,这种方法将变的难以使用。

  处理非正常的线程终止

  1.通过主动的方式处理。在任务处理线程的生命周期中,将通过某种抽象机制来调用许多未知的代码,我们应该对这些线程中执行的代码能否表现出正确的行为表示怀疑,因此这些线程应该在try-catch代码块中执行,这样就能捕获那些未检查的异常了,或者可以在try-finally代码块确保框架能够知道线程非正常退出的情况,并做出正确的相应。

  2.通过ThreadAPI提供的UncaughtExceptionHandler处理。UncaughtExceptionHandler能够检测出某个线程由于未补获异常而终止的情况。只有通过execute方法提交的任务才能将异常交给未补获异常处理器处理,通过submit提交的方法,无论时抛出检查的还是未检查的异常都将视为是任务返回状态的一部分。如果一个由submit提交的任务抛出了异常,那么这个异常将会被Future.get封装在ExecueExcetion中重新抛出。

  这两种方法时互补的,通过将这两种方法有效的结合在一起就能有效的防止线程泄露的问题。

java 多线程之取消与关闭的更多相关文章

  1. Java多线程之通过标识关闭线程

    package org.study2.javabase.ThreadsDemo.status; /** * @Auther:GongXingRui * @Date:2018/9/19 * @Descr ...

  2. java并发编程(1)并发程序的取消于关闭

    一.任务的取消于关闭 1.中断Thread 1.每个线程都有一个boolean类型的中断状态.true则是中断状态中 interrupt:发出中断请求:isInterrupt:返回中断状态:inter ...

  3. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...

  4. Java多线程系列--“JUC线程池”06之 Callable和Future

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

  5. Java多线程开发技巧

    很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读<Java并发编程实践&g ...

  6. Java多线程系列--“JUC线程池”01之 线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构 ...

  7. 【转】 Java 多线程之一

    转自   Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...

  8. Java多线程编程核心技术

    Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...

  9. java笔试要点(java多线程)

    一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...

随机推荐

  1. [原]toString()方法的复写作用, 以及打印集合.

    java中的每个类的根都是Object的子类. 必然有拥有了Object的所有方法. 在package java.lang.Object源码中: public String toString() { ...

  2. filter与servlet的比较

    filter与servlet的比较   主要从如下四个方面介绍他们之间的区别:                1.概念.                2.生命周期.                3 ...

  3. TMF大数据分析指南 Unleashing Business Value in Big Data(二)

    前言 此文节选自TMF Big Data Analytics Guidebook. TMF文档版权信息  Copyright © TeleManagement Forum 2013. All Righ ...

  4. matlab 矩阵运算技巧

    1.a=a(:) 作用:将矩阵转化成列向量 a=[a11 a12 a13                      a=[a11 a21 a12 a22 a13 a23]^T a21 a22 a23] ...

  5. ubuntu下php7安装及配置

    直接用apt-get 失败 在官网下安装包http://tw2.php.net/get/php-7.0.18.tar.bz2/from/a/mirror 进行make时 出现错误: libtool: ...

  6. Kolla Ocata版本安装及镜像制作流程

    1.关闭宿主机firewalldsystemctl disable firewalldsystemctl stop firewalld 2.配置selinux为disable,否则创建的实例网络不通临 ...

  7. [WIP]JavaScript import, export

    创建: 2019/06/14 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/import h ...

  8. 【转】C# String 前面不足位数补零的方法

    源地址:http://www.cnblogs.com/zhangqs008/archive/2012/02/01/2341078.html

  9. MCP|DYM|Quantitative mass spectrometry to interrogate proteomic heterogeneity in metastatic lung adenocarcinoma and validate a novel somatic mutation CDK12-G879V (利用定量质谱探究转移性肺腺瘤的蛋白质组异质性及验证新体细胞突变)

    文献名:Quantitative mass spectrometry to interrogate proteomic heterogeneity in metastatic lung adenoca ...

  10. Hibernate的优化方案

    使用参数绑定 使用绑定参数的原因是让数据库一次解析SQL,对后续的重复请求可以使用生成好的执行计划,这样做节省CPU时间和内存. 避免SQL注入. 尽量少使用NOT 如果where子句中包含not关键 ...