`
jzhihui
  • 浏览: 266280 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

中断线程的执行

    博客分类:
  • Java
阅读更多

--(《Java Concurrency in Practice》读书笔记)

 

中断线程是指:线程正在运行,还没有正常退出(run方法顺利结束),而某个事件的发生导致该线程必须中断当前正在执行的任务,该线程或者退出,或者等待其它事件然后再继续执行。稳定的基于线程的服务,在程序退出时,必须能够安全的释放线程所占用的资源,减少对系统性能的影响。

 

Thread类提供的方法中与此功能相关的函数有Thread.stopThread.suspendThread.resume。但是这几个函数都不能安全的提供相应的功能:Thread.stop会导致对象处理不一致的状态,而Thread.suspendThread.resume则会导致出现死锁,具体可见API文档描述。

虽然Thread类没有一种直接又安全的机制中断线程的执行,但是却提供了一种协作机制来完成类似的功能:Thread.interrupt。但是,别误解,单纯调用这个函数并不能完成我们定义的中断线程的功能,很多时候,它只是在线程内部设置一个状态位,表示当前线程收到过interrupt请求。在解释Thread.interrupt之前,我们先看一下,如果没有相关机制的支持,我们自己怎样完成中断线程执行的功能(这里不区分RunnableThread;这个机制要正常工作,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读写相关的InputStreamOutputStreamreadwrite操作都不会interrupt请求作出响应,但是关闭底层的Socket是导致readwrite操作招聘SocketException,所以也可以作为一种中断线程的方式。

 

JDK1.5后,Java中提供java.util.concurrent包,其中包含了若干跟并发和线程管理相关的功能。ThreadPoolExecutor.submit就可以通过返回一个Future来取消或中断当前任务的执行,Future底层的实现机制也是通过Thread.interrupt来实现的。

Future.cancel只能中断对interrupt请求有响应的操作,如果阻塞的操作对interrupt请求无响应怎么办?那么可以通过重写ThreadPoolExecutor.newTaskForJDK1.6)来返回自定义的Future.cancel来实现。

当然, Thread.interrupt机制要实现类似Thread.suspendThread.resume提供的暂停和继续的语义可能比较麻烦,不过,JDK中提供了其它的一些方便的机制来完成这个目的,比如wait-and-notifyObject.waitObject.notify)或者信号量等。

分享到:
评论

相关推荐

    动态控制线程执行和停止问题

    访问路径为:http://localhost:8080/web001/test.do?flag=xxyyzz&switch=off 其中switch开关参数取值有两种:on和off,on表示执行线程对应的任务,off表示中断线程正在执行的任务。

    什么是线程?Java中如何创建和管理线程?(java面试题附答案).txt

    join 方法:等待其他线程执行完毕后再继续执行。 interrupt 方法:中断线程的执行。 synchronized 关键字:用于实现线程的同步,确保多个线程之间的安全访问共享资源。 Lock 接口和 ReentrantLock 类:提供更灵活的...

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法、yield()方法、join方法、interrupt()方法

    线程的合并是指一个线程等待另一个线程执行完毕后再继续执行。在Java中,可以使用Thread类的join()方法实现线程的合并。 线程的中断是指在一个线程中断另一个线程的执行。在Java中,可以使用Thread类的interrupt()...

    Java-并发-Java线程中断与停止线程详解

      该方法“中断线程”,但仅仅是会设置该线程的中断状态位为true,至于中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。   线程会不时地检测这个中断标示位,以判断线程...

    Android中断线程的处理方法

    本文实例讲述了Android中断线程的处理方法。分享给大家供大家参考。具体方法如下: 我现在对一个用户注册的功能 1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog) 2.用一个线程...

    delphiXE多线程同步对象及异步执行.zip

    本下载解决delphiXE在处理多线程时,如何对各线程进行管理、如何做到中途中断执行多线程时的线程安全,如何在多线程内部进行UI同步等等,还可看我的博文同步。

    java中终止一个线程的方法总结(精)

     在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的...

    Java线程中断的本质深入理解

    Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下

    Visual Basic.NET线程参考手册

    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 中断一个...

    Java中断线程的方法

     1,线程正常执行完毕,正常结束。  也是让run方法执行完毕,该线程会正常结束。  2,监视某些条件,结束线程的不间断运行。  然而,常常有些线程是伺服线程。它们需要长时间的运行,只有在外部某些条件满足...

    线程超时死掉

    InterruptedException 线程被中断异常, ExecutionException任务执行异常,如果任务被取消,还会抛出CancellationException V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException,...

    C#线程锁介绍源码

    lock(Monitor.Enter和Monitor.Exit方法的封装),主要作用是锁定临界区,使临 界区代码只能被获得锁的线程执行。Monitor.Wait和Monitor.Pulse用于线程同步,类似信号操作,个人感觉使用比较复杂,容易造成死 锁。 ...

    操作系统多线程与文件系统实现

    使用turbo c提供interrupt关键,在每次时间片中断函数时保存现场的功能实现函数之间的切换;加上TCB管理的结构体,实现线程调度。 物理文件的存储结构 引导块区 FAT区 i节点区 数据区 实现的命令集 命令名称 使用...

    一种支持I/O的核外中断执行算法

    ARTs-OS中的中断管理应该提供的基本功能包括:管理中断处理设备、中断服务例程的管理、中断嵌套的管理、中断栈的维护、线程/进程切换时的现场保护和恢复等。

    Java中实现线程的超时中断方法实例

    之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下

    浅析c# 线程同步

    同步是一种只允许一个线程在特定时间访问某些资源的技术。没有其他线程可以中断,直到...它确保其他线程在执行完成之前不会中断执行。 下面,创建两个非同步和同步的例子。 C# 示例:非同步 在这个例子中,我们不使用

    JMETER 第一个完整实践例子

    线程启动的时间,下图的线程配置,1个线程,1秒启动时间,每个线程执行1次循环。那么每秒会启动一个线程,每次循环执行一个请求。 取样器错误: 当线程执行取样器失败的时候,要执行的策略 选项: 继续:忽略错误...

    嵌入式中断总结

    在 Linux 中,中断具有最高的优先级。不论在任何时刻,只要产生中断事件,内核将立即执行相应的中断 处理程序,等到所有挂起的...中断线程化之后,中断将作为内核线程运行而且被赋予不同的实时优先级,实时任务可以。

    Java如何中断一个正在运行的线程

    绍Java如何中断一个正在运行的线程

    92道Java多线程与并发面试题含答案(很全)

    Java并发编程的核心概念包括: 线程(Thread):线程是程序执行流的最小单元。...原子操作(Atomic Operations):原子操作是不可中断的操作,即在多线程环境中,这些操作要么完全执行,要么完全不执行。

Global site tag (gtag.js) - Google Analytics