`

关于线程中断thread interrupt

阅读更多

关于线程中断thread interrupt

在多线程编程中经常会遇到需要中止线程的情况,比如启动多个线程去数据库中搜索,如果有一个线程返回了结果,其他线程就可以取消了(Thread.stop()已经建议不要再使用)

1.通过成员方法Thread.interrupt()来设置中断状态为true
2.通过成员方法Thread.isInterrupted()来获取中断状态
3.通过静态方法Thread.interrupted()来获取中断状态,并且清除中断状态(当然获取的是清除之前的值),也就是说连续两次调用此方法,第二次一定会返回false,当然也有例外,具体看文档。

通常可以通过如下示例代码来控制线程退出,

public void run() 
{ 
while(flag) 
{ 
//执行的代码 
} 

} 

 
flag为false时线程停止。。。

下面测试线程被中断后的情况

public class ThreadInterruptTest { 
public static void main(String[] args) { 
Thread subThread = new Thread(new Runnable() { 

     @Override 
    public void run() { 
        boolean flag = false; 
        while (!flag) { 
        System.out.println(".....子线程运行中......"); 
        try { 
              Thread.sleep(1000); 
        } catch (InterruptedException e) { 
             // Thread.currentThread().interrupt(); 
            flag = Thread.interrupted(); 
        } 
} 
         System.out.println("子线程退出"); 

} 

}); 
subThread.start(); 
//主线程休息3s
try { 
     Thread.sleep(3000); 
} catch (InterruptedException e) { 
     e.printStackTrace(); 
} 
     subThread.interrupt(); //中断子线程 
} 

} 

 

运行上面的程序,会发现即便主线程调用了interrupt方法,子线程检测到异常后发现中断状态没有被置为true,导致循环不能退出,子线程不能退出,但是静态方法Thread.interrupted()的注释说: @return true if the current thread has been interrupted;false otherwise.

后来在Doug lea的书中找到了答案,根据规范,这是因为在sleep方法睡眠后,如果检测到InterruptedException异常被抛出,中断状态会被重新置为false,具体可能要看openjdk的c源码,后来我在The Java Language Specification也找到了相关的描述,If thread t is interrupted, an InterruptedException is thrown and t's interruption status is set to false.

如果我们处理完InterruptedException异常后需要保持并传递该中断状态的话只要再次调用Thread.currentThread().interrupt(),将中断状态置为true就好了,也就是上面注释掉的那一句


ps:参考Java并发编程:设计原则与模式

1
0
分享到:
评论
2 楼 zhufeng1981 2011-11-12  
研究的很仔细啊,佩服。
1 楼 lusong1986 2011-10-13  
好好好好哦

相关推荐

    浅谈Java线程Thread之interrupt中断解析

    主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java多线程之中断线程(Interrupt)的使用详解

    interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程

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

    线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法...线程的中断是指在一个线程中断另一个线程的执行。在Java中,可以使用Thread类的interrupt()方法实现线程的中断。(run方法执行完毕)

    interrupt()和线程终止方式_动力节点Java学院整理

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

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

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

    Java中interrupt的使用.docx

    interrupt(),在一个线程中调用另一个线程的interrupt()方法,即会向那个线程发出信号——线程中断状态已被设置。至于那个线程何去何从,由具体的代码实现决定。 isInterrupted(),用来判断当前线程的中断状态...

    thread-interrupt-test:显示线程中断行为的简单 Java 测试

    显示线程中断行为的简单 Java 测试运行:mvn clean test 进行演示

    浅析java线程中断的办法

    void thread.interrupt() 如果正在运行wait(),sleep(),join()这三个方法阻塞了线程,那么将会使得线程抛出InterruptedException异常,这是一个中断阻塞的过程。如果是其它的正在运行的状态,那么将不会有任何影响...

    Thread类的interrupt(),interrupted(),isInterrupted()1

    一般来说,支持线程中断的方法(也就是线程中断后会抛出InterruptedException的方法),阻塞函数,如:Thread.sleep、Thread.jo

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

    interrupt 方法:中断线程的执行。 synchronized 关键字:用于实现线程的同步,确保多个线程之间的安全访问共享资源。 Lock 接口和 ReentrantLock 类:提供更灵活的线程同步机制。 Executor 框架和线程池:用于管理...

    interruptor:运行一个函数,有可能被另一个线程中断

    中断器–运行一个函数,可以从另一个线程中断它 使用范例 import { runInterruptible , interrupt } from 'interruptor' ; runInterruptible ( handle => { // pass handle to another thread using .postMessage()...

    并发编程的魅力fager20200614.docx

    线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生; g.线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive...

    ThreadX API查询手册.chm

    ThreadX操作系统 CHM格式的帮助文档,能够方便地查阅ThreadX的所有函数实现,函数定义,函数描述,函数实例,并且分类整理好了各个类别的函数。 各个相关联的函数API之间支持链接跳转,使用起来相当方便。 格式与VC...

    面试官:如何终止线程?有几种方式?

    使用 interrupt()方法中断线程。 第一种:使用标志位终止线程 使用标志位终止线程就是定义一个boolean型的标志位 ,在线程的run方法中根据这个标志位是为true还是为false来判断是否终止,这种情况多用于while循环中...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...

    基于DOS的多任务系统的实现

    printf("the key word of the thread is : %d\n the name of thread is : %s\n the state of the thread is ",i,tcb[i].name); switch(tcb[i].state) { case (1): printf("Running \n");break; case (2)...

    Java並發編程實踐基礎

    1.3.3 使用中断(Interrupt)取消线程........................................................................15 1.3.4 使用Stop 终止线程........................................................................

Global site tag (gtag.js) - Google Analytics