`

关于线程中断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线程中断之interrupt和stop.docx

    ### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...

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

    interrupt机制并不是真正的将当前线程中断,而是一个中断标记的变化。 在Java中,interrupt机制的实现主要通过三个方法来实现: 1. Thread.interrupt():设置当前中断标记为true,类似属性的set方法。 2. Thread....

    java线程中的interrupt,isInterrupt,interrupted方法

    在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将详细介绍这三个方法的用法和区别。 interrupt 方法 interrupt...

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

    `Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的中断状态来向线程发送一个中断信号,这个信号是一个内部标志,告知线程应该停止其当前的工作。...

    Java并发编程示例(三):线程中断

    Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...

    Java线程中断示例程序的代码清单.pdf

    Java线程中断是一个关键特性,它允许程序员在运行时通知一个线程停止其当前的工作并进行清理。在上述的Java线程中断示例程序中,我们看到一个简单的场景,模拟了一个班级中的学生(student线程)和教师(teacher线程...

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

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

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

    "thread-interrupt-test"是一个用于演示Java线程中断行为的项目,通过运行`mvn clean test`命令,我们可以观察到线程中断的实践效果。 首先,线程中断并不意味着立即停止线程的执行,而是设置一个中断标志。当调用`...

    JavaThread中断机制共11页.pdf.zip

    在Java中,线程中断主要通过`Thread.interrupt()`方法实现,这个方法会设置线程的中断状态标志。下面将详细阐述Java线程中断机制的各个方面。 1. **线程中断状态** Java中的线程中断状态是一种标志,由`Thread....

    stm32f103c8t6移植RT-Thread之线程管理

    在RT-Thread中,中断服务需要在适当的位置调用`rt_interrupt_enter`和`rt_interrupt_leave`来通知调度器,保证中断处理的上下文安全。 此外,为了调试和优化,我们还可以利用RT-Thread提供的各种调试工具,如RTT ...

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

    在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...

    深入分析JAVA 多线程--interrupt()和线程终止方式

    本线程中断自己是被允许的;其它线程调用本线程的 interrupt() 方法时,会通过 checkAccess() 检查权限。这有可能抛出 SecurityException 异常。 如果本线程是处于阻塞状态:调用线程的 wait() , wait(long) 或 ...

    java中断线程的正确姿势完整示例.rar

    线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程应该尽快结束。线程需要定期检查中断状态,并...

    Android中断并重启一个Thread线程的简单方法

    线程中断是通过`Thread.interrupt()`方法来实现的,这个方法会设置当前线程的中断标志。但是,这并不会立即停止线程的执行,而是在线程运行过程中,如果检测到中断标志被设置,通常是在循环或者阻塞操作中,会抛出`...

    Java多线程中断机制三种方法及示例

    Java提供了三种方法来实现多线程中断机制:`interrupt()`,`interrupted()`和`isInterrupted()`。这些方法都是Thread类中的方法,用于实现线程的中断机制。 1. `interrupt()`方法 `interrupt()`方法是用来中断某个...

    JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止

    Java通过`Thread.interrupt()`方法提供线程中断机制。当调用一个线程的`interrupt()`方法时,并不会立即停止该线程,而是设置线程的中断状态。线程需要通过检查`InterruptedException`异常来响应中断。例如,当线程...

    多线程thread线程的理解

    9. **中断和异常**:线程可以通过`interrupt()`方法中断,其他线程可以检查`isInterrupted()`或`InterruptedException`来响应中断请求。理解和妥善处理中断是编写可控制的多线程程序的重要部分。 10. **守护线程...

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

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

    理解多线程,写一个多线程应用程序,要求能在用户级实现线程的调度,如启动、挂起、恢复、停止,的C thread、java thread实现。

    Java中,`join`方法有类似功能,而`interrupt`方法可以用来中断线程,通常配合`isInterrupted`或`interrupted`检查中断状态。 在实际应用中,线程调度还需要考虑线程同步和互斥问题,以防止数据竞争和死锁。C语言中...

Global site tag (gtag.js) - Google Analytics