java 多线程之取消与关闭
要使线程安全,快速,可靠的停下来并不是一件容易的事情。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 多线程之取消与关闭的更多相关文章
- Java多线程之通过标识关闭线程
package org.study2.javabase.ThreadsDemo.status; /** * @Auther:GongXingRui * @Date:2018/9/19 * @Descr ...
- java并发编程(1)并发程序的取消于关闭
一.任务的取消于关闭 1.中断Thread 1.每个线程都有一个boolean类型的中断状态.true则是中断状态中 interrupt:发出中断请求:isInterrupt:返回中断状态:inter ...
- java多线程系类:JUC线程池:01之线程池架构
概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程开发技巧
很多开发者谈到Java多线程开发,仅仅停留在new Thread(...).start()或直接使用Executor框架这个层面,对于线程的管理和控制却不够深入,通过读<Java并发编程实践&g ...
- Java多线程系列--“JUC线程池”01之 线程池架构
概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容——线程池.内容包括:线程池架构 ...
- 【转】 Java 多线程之一
转自 Java 多线程 并发编程 一.多线程 1.操作系统有两个容易混淆的概念,进程和线程. 进程:一个计算机程序的运行实例,包含了需要执行的指令:有自己的独立地址空间,包含程序内容和数据:不同进 ...
- Java多线程编程核心技术
Java多线程编程核心技术 这本书有利于对Java多线程API的理解,但不容易从中总结规律. JDK文档 1. Thread类 部分源码: public class Thread implements ...
- java笔试要点(java多线程)
一.线程的生命周期及五种基本状态 关于Java中线程的生命周期,首先看一下下面这张较为经典的图: 上图中基本上囊括了Java中多线程各重要知识点.掌握了上图中的各知识点,Java中的多线程也就基本上掌 ...
随机推荐
- JavaScript代码存在形式
<!-- 方式一 --> <script type"text/javascript" src="JS文件"></script> ...
- ipcs、ipcrm命令
进程间通信概述进程间通信有如下的目的:1.数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间:2.共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该 ...
- Angular12 学习angular2前的热身准备
1 ECMA European Computer Manufactures Association 这个组织的目标是评估,开发和认可电信和计算机标准. 百度百科:点击前往 ECMA65:满足ECMA标 ...
- 292C Beautiful IP Addresses
传送门 题目 The problem uses a simplified TCP/IP address model, please read the statement carefully. An I ...
- CSS学习系列2 -- CSS中的清除浮动
CSS中有一个很常见的问题,就是元素的浮动. 那么,到底什么是元素的浮动呢,我们来看一个例子 举个例子,在一个div里面内部有浮动元素的话,这个浮动元素会让这个div的高度塌陷. .myDiv{ ba ...
- Saving output of a grep into a file with colors
19 down vote favorite 7 I need to save the result of a grep command into a file, but I also want the ...
- App集成极光推送开发流程[关键步骤]
1.客户端集成SDK 1.1初始化 JPushInterface.setDebugMode(true); // 设置开启日志,发布时请关闭日志 JPushInterface.init(this); / ...
- 【Android-stdio-appdemo搭建记录】
1-如何删除存在的工程 2-创建Android项目 next设置app兼容最低版本:api15--android 4.0以上 创建活动页面 设置活动页面的名称 创建成功项目以后会有最基本的layout ...
- asp.net 防止二次提交 以及UseSubmitBehavior属性-转
页面上有一个按钮,点击之后提交表单,如果什么都不管的话,用户可以在服务器响应完成之前再次点击,这样就出现了二次提交,后果可大可小. 那么我们应该防止二次点击,就要在用户点第一次之后马上Disable这 ...
- SAS笔记(7) PROC SQL
参考资料:<Longitudinal Data and SAS: A Programmer's Guide>