Java 并发 中断线程
Java 并发 中断线程
@author ixenos
对Runnable.run()方法的三种处置情况
1.在Runnable.run()方法的中间中断它
2.等待该方法到达对cancel标志的测试(用一个if+标志变量)
3.等待该方法到达程序员准备好离开的地方
第一种情况比其他两种难以处置,因为当打断一个被阻塞的任务时,可能需要清理资源。
因此,在任务的run()方法中间打断,就像是抛出的异常,在“catch异常处理”中清理资源(否则不放锁),于是Java也为这种打断使用了异常机制。
可中断阻塞和不可中断阻塞
1.SleepBlock 是可中断的阻塞
2.IOBlocked 和 SynchronizedBlocked 是不可中断的阻塞(I/O和synchronized方法都不需要InterruptedException处理器)
示例:
1 // Interrupting a blocked thread.
2 import java.util.concurrent.*;
3 import java.io.*;
4 import static net.mindview.util.Print.*;
5
6 /*
7 SleepBlock
8
9 */
10 class SleepBlocked implements Runnable {
11 public void run() {
12 try {
13 TimeUnit.SECONDS.sleep(100);
14 } catch(InterruptedException e) {
15 print("InterruptedException");
16 }
17 print("Exiting SleepBlocked.run()");
18 }
19 }
20
21
22 /*
23 IOBlock
24 */
25 class IOBlocked implements Runnable {
26 private InputStream in;
27 public IOBlocked(InputStream is) { in = is; }
28 public void run() {
29 try {
30 print("Waiting for read():");
31 in.read();
32 } catch(IOException e) {
33 if(Thread.currentThread().isInterrupted()) {
34 print("Interrupted from blocked I/O");
35 } else {
36 throw new RuntimeException(e);
37 }
38 }
39 print("Exiting IOBlocked.run()");
40 }
41 }
42
43
44 /*
45 SynchronizedBlock
46
47 */
48 class SynchronizedBlocked implements Runnable {
49 public synchronized void f() {
50 while(true) // Never releases lock
51 Thread.yield();
52 }
53 public SynchronizedBlocked() {
54 new Thread() {
55 public void run() {
56 f(); // Lock acquired by this thread
57 }
58 }.start();
59 }
60 public void run() {
61 print("Trying to call f()");
62 f();
63 print("Exiting SynchronizedBlocked.run()");
64 }
65 }
66
67
68 public class Interrupting {
69 //用java.util.concurrent.*包中的Executor来统一管理多个线程
70 private static ExecutorService exec =
71 Executors.newCachedThreadPool();
72
73 static void test(Runnable r) throws InterruptedException{
74 /*
75 submit() 启动任务将返回Future<?>,
76 可以调用cancel来调用interrupt方法中断某个特定任务;
77 executor() 启动任务,
78 只能调用shutdownNow()来中断所有任务。
79 */
80 Future<?> f = exec.submit(r);
81 TimeUnit.MILLISECONDS.sleep(100);
82 print("Interrupting " + r.getClass().getName());
83
84
85 f.cancel(true); // Interrupts if running
86 print("Interrupt sent to " + r.getClass().getName());
87 }
88
89 //main方法
90 public static void main(String[] args) throws Exception {
91 test(new SleepBlocked());
92 test(new IOBlocked(System.in));
93 test(new SynchronizedBlocked());
94 TimeUnit.SECONDS.sleep(3);
95 print("Aborting with System.exit(0)");
96 System.exit(0); // ... since last 2 interrupts failed
97 }
98 } /* Output: (95% match)
99 Interrupting SleepBlocked
100 InterruptedException
101 Exiting SleepBlocked.run()
102 Interrupt sent to SleepBlocked
103 Waiting for read():
104 Interrupting IOBlocked
105 Interrupt sent to IOBlocked
106 Trying to call f()
107 Interrupting SynchronizedBlocked
108 Interrupt sent to SynchronizedBlocked
109 Aborting with System.exit(0)
110 *///:~
中断线程
1.Thread类包含interrupt()方法,可以终止被阻塞的任务,这个方法将设置线程的中断状态
1)如果一个线程已被阻塞 或 试图执行一个阻塞操作时,调用interrupt设置这个线程的中断状态,将抛出InterruptedException
2)当抛出InterruptedException 或 该任务调用Thread.interrupted()时,中断状态将被复位为 false (但实际已中断~)。
- 可见,使用Thread.interrupted() 既离开run()循环 中断线程,又不抛出InterruptedException
2.中断状态:中断状态是每一个线程都具有的boolean标志,(建议每个线程都应该不时地检查这个标志,以判断线程是否被中断)
1)t.interrupt(): 当对一个线程调用interrupt()方法时,线程的中断状态将被置位
2)Thread.interrupted():
Java 并发 中断线程的更多相关文章
- Java 并发编程 | 线程池详解
原文: https://chenmingyu.top/concurrent-threadpool/ 线程池 线程池用来处理异步任务或者并发执行的任务 优点: 重复利用已创建的线程,减少创建和销毁线程造 ...
- java并发编程 线程基础
java并发编程 线程基础 1. java中的多线程 java是天生多线程的,可以通过启动一个main方法,查看main方法启动的同时有多少线程同时启动 public class OnlyMain { ...
- Java 并发:线程中断-interrupt
一直以为执行了interrupt方法就可以让线程结束,并抛出InterruptedException. 今天看了Java并发编程实战的第七章发现并不是这么回事,在这章的开头就提到 要使任务和线程能安全 ...
- Java并发1——线程创建、启动、生命周期与线程控制
内容提要: 线程与进程 为什么要使用多线程/进程?线程与进程的区别?线程对比进程的优势?Java中有多进程吗? 线程的创建与启动 线程的创建有哪几种方式?它们之间有什么区别? 线程的生命周期与线程控制 ...
- java并发:线程同步机制之Lock
一.初识Lock Lock是一个接口,提供了无条件的.可轮询的.定时的.可中断的锁获取操作,所有加锁和解锁的方法都是显式的,其包路径是:java.util.concurrent.locks.Lock, ...
- Java并发3-多线程面试题
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速. 2) 线程和进程有什 ...
- java并发编程 | 线程详解
个人网站:https://chenmingyu.top/concurrent-thread/ 进程与线程 进程:操作系统在运行一个程序的时候就会为其创建一个进程(比如一个java程序),进程是资源分配 ...
- Java并发实现线程阻塞原语LockSupport
LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现.LockSupport是用来创建锁和其他同步类的基本线程阻塞原语. 1.Lock ...
- Java并发——ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式
前言: 在刚学Java并发的时候基本上第一个demo都会写new Thread来创建线程.但是随着学的深入之后发现基本上都是使用线程池来直接获取线程.那么为什么会有这样的情况发生呢? new Thre ...
随机推荐
- C# 语言的多线程编程,完全是本科OS里的知识
基本知识,无参数Thread和带参数的Thread Thread类的参数就是参数指针,可以传入一个无参的函数. 如果要传入带参数的函数,先new一个ParameterizedThreadStart委托 ...
- 【转】GIT和SVN之间的五个基本区别
如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等.如果 ...
- Knockout 可扩展性
你需要知道的顶级特性 Knockout 最棒的一个特点就是它的可扩展性.Knockout 存在大量的扩展点,包含大量的工具来创建我们的应用程序.许多开发者除了 Knockout 核心库之外没有使用任何 ...
- 苹果推送通知服务Push Notification探究总结(序)
刚才发了两篇几个月前写的文档,觉得太敷衍了,想了想,还是来一发实在的. 再者,刚好上周研究了苹果的推送通知服务Push Notification,还是很有心得的,赶紧趁热打铁,记录一下,望与大家谈论下 ...
- asp.net 的一个简单进度条功能
我们先看下效果 我点击了按钮后他会显示进度页面,进度完成后,进度条消失,其实也是比较简单的了. 我们需要一个进度条代码文件ProgressBar.htm(注意:是没有head这些标签的) <sc ...
- Debian 7.1设置中文环境
之前在Chinaunix上看过一个人写过博客,是关于介绍Debian设置中文环境的,在这里我针对Debian 7来补全一下. Debian是非常经典而优秀的Linux发行版了,Debian是个很大的家 ...
- WinDBG中加载SOS和CLR
WinDBG中加载SOS和CLR 最近产品环境出现了部分服务器当机情况,虽然重启之后问题就不出现了.但本着彻底解决问题的态度,想要找到root cause.多次尝试Visual Studio失败(可能 ...
- Weka开发[4]-特征选择
特征选择,我对这一部分也不熟,大概讲一下,用AttributeSelection进行特征选择,它需要设置3个方面,第一:对属性评价的类(自己到Weka软件里看一下,英文Attribute Evalua ...
- jquery选择器之属性过滤选择器
<style type="text/css"> /*高亮显示*/ .highlight{ background-color: gray } </style> ...
- jQuery LigerUI V1.2.2
jQuery LigerUI V1.2.2 (包括API和全部源码) 发布 前言 这次版本主要对树进行了加载性能上面的优化,并解决了部分兼容性的问题,添加了几个功能点. 欢迎使用反馈. 相关链接 AP ...