Thread.interrupt()方法不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出 阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join,Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
建议使用外部的布尔变量进行控制,比如:
class MyThread extends Thread { volatile boolean finished = false; public void stopMe() { finished = true; } public void run() { while (!finished) { //do dirty work } } }
public class AlternateStop implements Runnable { private volatile boolean stopRequested; private Thread runThread; public void run() { runThread = Thread.currentThread(); stopRequested = false; int count = 0; while (!stopRequested) { System.out.println("Running ... count=" + count); count++; try { Thread.sleep(300); } catch (InterruptedException x) { System.out.println("捕获异常后---"+Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt(); // re-assert interrupt System.out.println("重新设置打断状态---"+Thread.currentThread().isInterrupted()); } } System.out.println("stoped"); } public void stopRequest() { stopRequested = true; if (runThread != null) { runThread.interrupt(); } } public static void main(String[] args) { AlternateStop as = new AlternateStop(); Thread t = new Thread(as); t.start(); try { Thread.sleep(2000); } catch (InterruptedException x) { // ignore } as.stopRequest(); } }
注意当一个阻塞方法检测到中断并抛出 InterruptedException 时,它清除中断状态,为了让上层代码知道 该线程的状态,重新设置打断状态。
System.out.println("捕获异常后---"+Thread.currentThread().isInterrupted()); Thread.currentThread().interrupt(); // re-assert interrupt System.out.println("重新设置打断状态---"+Thread.currentThread().isInterrupted());
以上三行代码会打印:
捕获异常后---false
重新设置打断状态---true
相关推荐
│ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...
9. **中断线程**:Java提供了Thread类的interrupt()和isInterrupted()方法来中断和检查线程的中断状态。不过需要注意的是,中断并不意味着立即停止线程,而是向线程发送一个中断信号,由线程自己决定如何响应。 10....
- `interrupt()`:中断线程。 - `isAlive()`:判断线程是否处于活动状态。 - `getName()`/`setName()`:获取/设置线程名称。 - `getId()`:获取线程ID。 - `getPriority()`/`setPriority()`:获取/设置线程优先级。 ...
Java并发编程中的线程中断是一个关键机制,它允许开发者在程序运行过程中显式地请求某个线程停止执行。在本示例中,我们创建了一个名为`PrimeGenerator`的线程,该线程会不断地查找并打印质数。线程中断机制的使用...
1.3.3 使用中断(Interrupt)取消线程........................................................................15 1.3.4 使用Stop 终止线程........................................................................
- interrupt()方法用于中断线程,isInterrupted()和interrupted()检查线程是否被中断,通常配合循环使用,中断标志可以作为退出循环的条件。 通过深入学习《JAVA并发编程艺术》,开发者能更好地理解并发编程的原理...
4. **线程管理**:`Thread`类提供了管理线程生命周期的方法,如`sleep()`使当前线程休眠指定时间,`interrupt()`中断线程,以及`join()`等待线程结束等。`sleep()`可能会被`InterruptedException`打断,所以在使用时...
Java线程与并发编程实践是Java开发者必备的技能之一,特别是在多核处理器和高并发应用环境中,有效地管理和利用线程能极大地提升程序的性能。本书《java线程与并发实践编程》由Jeff Friesen撰写,2017年2月出版,...
│ 高并发编程第一阶段15讲、Thread中断Interrupt方法详细讲解.mp4 │ 高并发编程第一阶段16讲、采用优雅的方式结束线程生命周期.mp4 │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力...
总的来说,Java并发编程线程入门需要理解进程和线程的概念,熟悉线程的创建与管理,掌握线程同步和互斥的机制,以及如何处理线程中断和异常。随着Java并发库的不断发展,开发者现在有更多的工具和策略来解决并发问题...
9. **中断**:`Thread.interrupt()`方法可以用来中断线程,而`isInterrupted()`和`interrupted()`方法则用于检查中断状态。 10. **守护线程(Daemon Thread)**:守护线程不阻止JVM的退出,常用于后台服务,如垃圾...
### 并发编程面试专题知识点解析 #### 一、线程执行顺序控制 **知识点:** 1. **问题描述:** 如何确保线程T2在T1执行完毕后开始执行,T3在T2执行完毕后开始执行? 2. **解决方案:** 可以通过`Thread.join()`方法...
创建线程、启动线程、线程的生命周期(新建、就绪、运行、阻塞、死亡)以及线程间的通信(join、interrupt、yield、sleep)都是并发编程的基本操作。 3. **线程池**:Executor框架是Java 5引入的,用于管理和控制...
标题 "为什么不鼓励使用 Thread.stop" 涉及到的是Java多线程编程中的一个重要话题,主要探讨了为何在实际开发中不建议直接使用 `Thread.stop` 方法来终止一个线程的执行。 在Java中,`Thread.stop` 被设计为停止一...
Java并发编程是Java开发中的重要领域,它涉及到多线程的使用、同步机制以及线程安全的实现。在Java中,并发编程可以帮助我们利用多核处理器的优势,提高程序的执行效率,但同时也需要处理好线程间的交互和数据一致性...
Thread类的interrupt()方法用于中断线程,而isInterrupted()和interrupted()检查中断状态。在并发编程中,正确处理InterruptedException是至关重要的。 以上就是Java并发编程的一些核心知识点。在实际开发中,熟练...
- Thread.getThreadGroup()获取线程所属的线程组,Thread.interrupt()和Thread.currentThread().interrupted()分别用于中断和检查当前线程是否被中断。 10. **线程的等待/通知机制** - 使用wait()、notify()、...
3. **Thread类的方法**:包括start()方法用于启动线程,sleep()方法用于使当前线程休眠指定的时间,interrupt()方法用于中断线程,join()方法用于让一个线程等待另一个线程完成等。 4. **线程状态**:Java线程具有...
在Java编程中,多线程是并发执行任务的关键机制,但同时也带来了许多挑战,其中之一就是如何安全地中断一个正在运行的线程。本篇文章主要探讨了如何正确地中断线程,避免潜在的问题。 首先,我们要明确一点:Java中...