要使线程安全,快速,可靠的停下来并不是一件容易的事情。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. WEB 项目中的全局异常处理

    在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...

  2. struts2.Action中的method属性配置

    .Action中的method属性 在struts1.x中我们知道通过继承DispatchAction可以实现把多个Action进行统一操作,在struts2中实现action的统一操作也很简单.我们 ...

  3. super关键字主要有以下两种用途

    super关键字主要有以下两种用途. 1.调用父类的构造方法 子类可以调用由父类声明的构造方法.但是必须在子类的构造方法中使用super关键字来调用.其具体的语法格式如下: super([参数列表]) ...

  4. Luogu 4768 [NOI2018]归程

    并不会写Kruskal重构树,两个$log$跑得比较卡. 首先考虑一下没有强制在线的要求怎么办,有一个比较容易想到的做法就是先跑一遍最短路,然后把所有边按照海拔从大到小排序,把所有询问的海拔也从大到小 ...

  5. MQTT结构分析

    MQTT,是: 轻量级的消息订阅和发布(publish/subscribe)协议 建立在TCP/IP协议之上 IoT,internet of things,物联网,MQTT在这方面应用较多. 官方网站 ...

  6. kolla制作过程中:neutron-sfc-agent 报错的问题

    在使用二进制方式编译镜像的时候,neutron的sfc-agent提示如下错误ERROR:kolla.image.build:neutron-sfc-agent Failed with status: ...

  7. Codeforces Round #527 (Div. 3)C(多重集,STRING)

    #include<bits/stdc++.h>using namespace std;const int maxn=1e6+7;pair<string,int>p[maxn]; ...

  8. Codeforces Beta Round #71 C【KMP+DP】

    Codeforces79C 题意: 求s串的最大子串不包含任意b串: 思路: dp[i]为以i为起点的子串的最长延长距离. 我们可以想到一种情况就是这个 i 是某个子串的起点,子串的长度-1就是最短, ...

  9. 2017-10-17 NOIP模拟赛2

    a [问题描述]你是能看到第一题的 friends 呢.——hja何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为字符串定义了新的权值计算方法.一个字符串由小写字母组成,字符串的 ...

  10. Mysql-5-数据表的基本操作

    1.创建表:之前需要use database database_name 然后create table 表名(): 例:创建员工表tb_employee1,结构如下表所示 字段名称 数据类型 备注 i ...