关于线程中断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并发编程:设计原则与模式
分享到:
相关推荐
### Java线程中断机制详解:`interrupt`与`stop`方法 #### 一、引言 在Java多线程编程中,线程控制是至关重要的技术之一。有时我们需要在特定条件下停止某个线程的执行,或者中断正在等待的线程。Java提供了多种...
interrupt机制并不是真正的将当前线程中断,而是一个中断标记的变化。 在Java中,interrupt机制的实现主要通过三个方法来实现: 1. Thread.interrupt():设置当前中断标记为true,类似属性的set方法。 2. Thread....
在 Java 中,线程(Thread)类提供了三个相关的方法:interrupt、isInterrupted 和 interrupted,这三个方法都是用于处理线程的中断状态的。下面我们将详细介绍这三个方法的用法和区别。 interrupt 方法 interrupt...
`Thread.interrupt()`方法是中断线程的主要手段,但它的行为并不像字面意义上那样直接终止线程。相反,它通过设置线程的中断状态来向线程发送一个中断信号,这个信号是一个内部标志,告知线程应该停止其当前的工作。...
Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...
Java线程中断是一个关键特性,它允许程序员在运行时通知一个线程停止其当前的工作并进行清理。在上述的Java线程中断示例程序中,我们看到一个简单的场景,模拟了一个班级中的学生(student线程)和教师(teacher线程...
线程的基本概念、线程类、任务类、线程优先级、sleep()方法(休眠)、yield()方法...线程的中断是指在一个线程中断另一个线程的执行。在Java中,可以使用Thread类的interrupt()方法实现线程的中断。(run方法执行完毕)
"thread-interrupt-test"是一个用于演示Java线程中断行为的项目,通过运行`mvn clean test`命令,我们可以观察到线程中断的实践效果。 首先,线程中断并不意味着立即停止线程的执行,而是设置一个中断标志。当调用`...
在Java中,线程中断主要通过`Thread.interrupt()`方法实现,这个方法会设置线程的中断状态标志。下面将详细阐述Java线程中断机制的各个方面。 1. **线程中断状态** Java中的线程中断状态是一种标志,由`Thread....
在RT-Thread中,中断服务需要在适当的位置调用`rt_interrupt_enter`和`rt_interrupt_leave`来通知调度器,保证中断处理的上下文安全。 此外,为了调试和优化,我们还可以利用RT-Thread提供的各种调试工具,如RTT ...
在Java多线程编程中,理解`Thread`类中的`interrupt()`、`interrupted()`和`isInterrupted()`方法至关重要,因为它们与线程中断机制紧密相关。线程中断是Java提供的一种协作式中断机制,它并不强制结束线程,而是...
本线程中断自己是被允许的;其它线程调用本线程的 interrupt() 方法时,会通过 checkAccess() 检查权限。这有可能抛出 SecurityException 异常。 如果本线程是处于阻塞状态:调用线程的 wait() , wait(long) 或 ...
线程中断是通过调用`Thread.interrupt()`方法来实现的,它会设置线程的中断标志。当线程正在运行时,这个中断标志通常不会立即导致线程停止,而是作为一种请求,告知线程应该尽快结束。线程需要定期检查中断状态,并...
线程中断是通过`Thread.interrupt()`方法来实现的,这个方法会设置当前线程的中断标志。但是,这并不会立即停止线程的执行,而是在线程运行过程中,如果检测到中断标志被设置,通常是在循环或者阻塞操作中,会抛出`...
Java提供了三种方法来实现多线程中断机制:`interrupt()`,`interrupted()`和`isInterrupted()`。这些方法都是Thread类中的方法,用于实现线程的中断机制。 1. `interrupt()`方法 `interrupt()`方法是用来中断某个...
Java通过`Thread.interrupt()`方法提供线程中断机制。当调用一个线程的`interrupt()`方法时,并不会立即停止该线程,而是设置线程的中断状态。线程需要通过检查`InterruptedException`异常来响应中断。例如,当线程...
9. **中断和异常**:线程可以通过`interrupt()`方法中断,其他线程可以检查`isInterrupted()`或`InterruptedException`来响应中断请求。理解和妥善处理中断是编写可控制的多线程程序的重要部分。 10. **守护线程...
thread.interrupt() 该方法“中断线程”,但仅仅是会设置该线程的中断状态位为true,至于中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。 线程会不时地检测这个中断...
Java中,`join`方法有类似功能,而`interrupt`方法可以用来中断线程,通常配合`isInterrupted`或`interrupted`检查中断状态。 在实际应用中,线程调度还需要考虑线程同步和互斥问题,以防止数据竞争和死锁。C语言中...