--(《Java Concurrency in Practice》读书笔记)
中断线程是指:线程正在运行,还没有正常退出(run方法顺利结束),而某个事件的发生导致该线程必须中断当前正在执行的任务,该线程或者退出,或者等待其它事件然后再继续执行。稳定的基于线程的服务,在程序退出时,必须能够安全的释放线程所占用的资源,减少对系统性能的影响。
Thread类提供的方法中与此功能相关的函数有Thread.stop,Thread.suspend,Thread.resume。但是这几个函数都不能安全的提供相应的功能:Thread.stop会导致对象处理不一致的状态,而Thread.suspend和Thread.resume则会导致出现死锁,具体可见API文档描述。
虽然Thread类没有一种直接又安全的机制中断线程的执行,但是却提供了一种协作机制来完成类似的功能:Thread.interrupt。但是,别误解,单纯调用这个函数并不能完成我们定义的中断线程的功能,很多时候,它只是在线程内部设置一个状态位,表示当前线程收到过interrupt请求。在解释Thread.interrupt之前,我们先看一下,如果没有相关机制的支持,我们自己怎样完成中断线程执行的功能(这里不区分Runnable和Thread;这个机制要正常工作,volatile关键字不能缺):
class CancellableTask1 implements Runnable {
private volatile boolean cancelled = false;
@Override
public void run() {
while (!cancelled) {
doSomething();
}
}
public void cancel() { cancelled = true; };
}
现在考虑一个问题,如果doSomething中执行一个长时间阻塞的操作(比如sleep),那会发生什么情况?这个线程要么等待长时间(取决于阻塞操作等待的时间)后退出,要么一直不会退出(阻塞操作等待的事件没有发生)。这时候,Thread.interrupt就会发挥作用,来看一下它的API描述(原文比较详细,这里只是大致总结):
a)
如果当前线程处于阻塞状态(部分阻塞操作,一般情况下指可抛出InterruptedException的操作,如Thread.sleep),那么调用Thread.interrupt,该线程会收到一个InterruptedException,并且将当前线程的中断状态清除;
b)
如果当前线程没有阻塞,那么调用Thread.interrupt后,当前线程的中断状态被设置成true。
看描述Thread.interrupt是不能直接完成中断线程的目的,所以才说它是一种协作机制。我们来看一下这种协作机制在操作阻塞时完成中断线程的目标:
class CancellableTask2 implements Runnable {
@Override
public void run() {
try {
while (true) {
doSomething();
}
} catch (InterruptedException e) {
// Exit thread, or do something before exit.
// Preserve interrupt status
Thread.currentThread().interrupt();
}
}
public void cancel() { Thread.currentThread().interrupt();
}
这种方式下,如果有interrupt请求,线程会立即退出,当然,Thread.interrupt调用并没有强制线程一定要对interrupt请求作出响应,也可以忽略请求,继续运行(如CancellableTask3),这就取决于线程创建者采取的响应策略。只有清楚一个线程的响应策略时,才能利用Thread.interrupt机制来中断线程运行。
class CancellableTask3 implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
doSomething();
} catch (InterruptedException e) {
// Continue
}
}
}
public void cancel() { Thread.currentThread().interrupt(); }
}
前面说明Thread.interrupt的作用时提到,只有部分阻塞操作会对interrupt请求作出响应抛出InterruptedException,那对interrupt请求无响应的操作,该怎么处理?如跟Socket读写相关的InputStream,OutputStream的read和write操作都不会interrupt请求作出响应,但是关闭底层的Socket是导致read和write操作招聘SocketException,所以也可以作为一种中断线程的方式。
JDK1.5后,Java中提供java.util.concurrent包,其中包含了若干跟并发和线程管理相关的功能。ThreadPoolExecutor.submit就可以通过返回一个Future来取消或中断当前任务的执行,Future底层的实现机制也是通过Thread.interrupt来实现的。
Future.cancel只能中断对interrupt请求有响应的操作,如果阻塞的操作对interrupt请求无响应怎么办?那么可以通过重写ThreadPoolExecutor.newTaskFor(JDK1.6)来返回自定义的Future.cancel来实现。
当然, Thread.interrupt机制要实现类似Thread.suspend、Thread.resume提供的暂停和继续的语义可能比较麻烦,不过,JDK中提供了其它的一些方便的机制来完成这个目的,比如wait-and-notify(Object.wait和Object.notify)或者信号量等。
分享到:
相关推荐
访问路径为:http://localhost:8080/web001/test.do?flag=xxyyzz&switch=off 其中switch开关参数取值有两种:on和off,on表示执行线程对应的任务,off表示中断线程正在执行的任务。
join 方法:等待其他线程执行完毕后再继续执行。 interrupt 方法:中断线程的执行。 synchronized 关键字:用于实现线程的同步,确保多个线程之间的安全访问共享资源。 Lock 接口和 ReentrantLock 类:提供更灵活的...
线程的合并是指一个线程等待另一个线程执行完毕后再继续执行。在Java中,可以使用Thread类的join()方法实现线程的合并。 线程的中断是指在一个线程中断另一个线程的执行。在Java中,可以使用Thread类的interrupt()...
该方法“中断线程”,但仅仅是会设置该线程的中断状态位为true,至于中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。 线程会不时地检测这个中断标示位,以判断线程...
本文实例讲述了Android中断线程的处理方法。分享给大家供大家参考。具体方法如下: 我现在对一个用户注册的功能 1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog) 2.用一个线程...
本下载解决delphiXE在处理多线程时,如何对各线程进行管理、如何做到中途中断执行多线程时的线程安全,如何在多线程内部进行UI同步等等,还可看我的博文同步。
在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的...
Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
2.1.1 Thread类 2.1.2 创建一个线程 2.1.3 ThreadStart委托和执行分支 2.1.4 线程的属性和方法 2.1.5 线程的优先级 2.1.6 计时器和回调 2.1.7 使用线程调节线程 2.2 线程的生存期 2.2.1 使线程睡眠 2.2.2 中断一个...
1,线程正常执行完毕,正常结束。 也是让run方法执行完毕,该线程会正常结束。 2,监视某些条件,结束线程的不间断运行。 然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足...
InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException,...
lock(Monitor.Enter和Monitor.Exit方法的封装),主要作用是锁定临界区,使临 界区代码只能被获得锁的线程执行。Monitor.Wait和Monitor.Pulse用于线程同步,类似信号操作,个人感觉使用比较复杂,容易造成死 锁。 ...
使用turbo c提供interrupt关键,在每次时间片中断函数时保存现场的功能实现函数之间的切换;加上TCB管理的结构体,实现线程调度。 物理文件的存储结构 引导块区 FAT区 i节点区 数据区 实现的命令集 命令名称 使用...
ARTs-OS中的中断管理应该提供的基本功能包括:管理中断处理设备、中断服务例程的管理、中断嵌套的管理、中断栈的维护、线程/进程切换时的现场保护和恢复等。
之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下
同步是一种只允许一个线程在特定时间访问某些资源的技术。没有其他线程可以中断,直到...它确保其他线程在执行完成之前不会中断执行。 下面,创建两个非同步和同步的例子。 C# 示例:非同步 在这个例子中,我们不使用
线程启动的时间,下图的线程配置,1个线程,1秒启动时间,每个线程执行1次循环。那么每秒会启动一个线程,每次循环执行一个请求。 取样器错误: 当线程执行取样器失败的时候,要执行的策略 选项: 继续:忽略错误...
在 Linux 中,中断具有最高的优先级。不论在任何时刻,只要产生中断事件,内核将立即执行相应的中断 处理程序,等到所有挂起的...中断线程化之后,中断将作为内核线程运行而且被赋予不同的实时优先级,实时任务可以。
绍Java如何中断一个正在运行的线程
Java并发编程的核心概念包括: 线程(Thread):线程是程序执行流的最小单元。...原子操作(Atomic Operations):原子操作是不可中断的操作,即在多线程环境中,这些操作要么完全执行,要么完全不执行。