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中的多线程也就基本上掌 ...
随机推荐
- play 1.2.4的action执行前后的加载逻辑
——杂言:最近在整理这一年的笔记,打算慢慢温故一遍,然后搬到博客里头来.这篇是2013.06.18时候整理的关于action执行前后的一些载入先后顺序逻辑.我的理解可能有偏差,如果有错误的,请读者们及 ...
- centos 7之文件共享
一,安装过程 1.在VirtualBox的软件菜单里面选择 “设备”--“存储”,添加VBoxGuestAdditions.iso(在VirtualBox目录下). 2.在桌面上出现一个光驱 ...
- SpringBoot02 Controller的使用、数据库操作、事物管理、修改banner
1 Controller的使用 特点:编程技巧和SpringMVC几乎完全一样 注意:@RestController = @Controller + @ResponseBody 注意:读取路径参数和请 ...
- Leetcode:206. Reverse Linked List
这题直接ac掉 class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; while(he ...
- .net动态代理-EMIT,AOP实现
动态代理实现原理: 通过动态基础目标类,重写目标虚方法,.net中实现手段-il Emit.Proxy项目源码,https://github.com/1448376744/Emit.Proxy 以下是 ...
- MVC过滤大法(过滤静态文件)
参考文章:https://prerakkaushik.wordpress.com/2014/02/12/routing-request-for-static-files-with-or-without ...
- Note: Improving Restore Speed for Backup Systems that Use Inline Chunk-Based Deduplication
思路/方法 Measuring restore speed 提出了speed-factor,用以衡量存储速度. Container capping 限制恢复文件时使用的container个数,为了保证 ...
- Smtp错误码
Smtp错误码列表及相关原因 错误总表 420 1. Timeout Communication Problem Encountered During Transmission. Thie Is a ...
- mysql的性能优化总结
经验是从别人那里拿来的,不想直接复制黏贴,想亲自总结下,巴拉巴拉.........进入正题吧 一.为查询加入缓存 1.检查数据库是否开启缓存:show variables like '%query_c ...
- neutron负载均衡高可用测试
对工作中,实验环境的一个小总结 1.创建高可用负载均衡器------创建高可用的时候,添加上ha-mode参数即可 neutron lb-pool-create --lb-method ROUND_R ...