线程中断Thread.interrupt()的用法

本文深入解析Java中线程中断机制的核心概念,包括`isInterrupted()`和`interrupted()`方法的区别,通过实例展示如何在多线程环境下实现中断功能,并讨论其在实际开发中的应用。
package p;

import java.math.BigInteger;

public class ThreadInterruptTest {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		Thread t = new Thread(new Runnable() {
			@Override
			public void run() {
				BigInteger p = BigInteger.ONE;
				while(!Thread.currentThread().isInterrupted()){
					// 输出质数
					System.out.println(p = p.nextProbablePrime());
				}
			}
		});
		t.start();
		
		Thread.sleep(1000);
		t.interrupt();
	}

}

需要注意以下两个方法的区别:

boolean isInterrupted()

测试线程是否已经中断。线程的中断状态 不受该方法的影响。

static boolean interrupted()

测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。 



<think>好的,用户想了解Java中Thread.interrupt用法和示例解释。首先,我需要回忆一下Thread.interrupt方法的作用。这个方法用于中断线程,但并不是强制停止线程,而是设置一个中断标志,线程需要自行检查这个标志并做出响应。 接下来,用户希望看到具体的示例,我需要参考提供的引用内容。引用1中的示例代码展示了当线程中断时,捕获InterruptedException,并打印中断状态。但这里有个问题,当抛出InterruptedException时,中断状态会被清除,所以需要重新设置中断状态,这一点在引用3中提到了,应该在捕获异常时调用Thread.currentThread().interrupt()来恢复中断状态。 引用2中的示例则展示了正确的中断处理方式,在捕获异常后重新中断线程,并在循环条件中检查中断状态。这符合最佳实践,确保线程能够正确响应中断。 现在需要将这些信息整理成一个清晰的回答结构。首先解释interrupt方法的作用,然后给出基础示例,说明如何中断线程和处理中断。接着,可能需要提到常见的误区,比如在捕获异常后不恢复中断状态的问题,并给出正确示例。最后,总结使用时的注意事项,如检查中断状态的方式和异常处理的重要性。 还需要确保回答符合用户的要求,包括使用中文、正确的LaTeX格式(虽然这里可能不需要数学公式),以及生成相关问题。检查是否有遗漏的要点,比如interrupt不会强制终止线程,只是设置标志,需要线程协作。同时,需要引用提供的参考文献,正确标注引用来源。 最后,生成相关问题时要围绕Thread.interrupt的深入应用,比如中断处理的最佳实践、与stop方法的区别、应用场景等。确保问题有助于用户进一步学习相关知识点。</think>### Thread.interrupt() 方法详解及示例 #### 一、方法作用 `Thread.interrupt()` 是Java多线程编程中用于**请求中断线程**的方法,其核心功能是: 1. 设置目标线程的**中断状态**为`true` 2.线程处于阻塞状态(如`sleep()`/`wait()`),将抛出`InterruptedException`并清除中断状态[^1][^3] #### 二、基础用法示例 ```java public class InterruptDemo { public static void main(String[] args) { Thread worker = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("工作中..."); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("检测到中断请求"); Thread.currentThread().interrupt(); // 重新设置中断标志[^3] } } System.out.println("线程终止"); }); worker.start(); worker.interrupt(); // 发送中断请求 } } ``` #### 三、关键执行流程 1. `worker.interrupt()`触发中断请求 2. 线程进入`sleep()`时立即抛出`InterruptedException` 3. 异常捕获块中**必须重置中断标志**(`Thread.currentThread().interrupt()`)[^3] 4. 循环条件`!Thread.currentThread().isInterrupted()`检测到中断后退出循环 #### 四、注意事项 1. 中断处理必须通过`try-catch`或主动检查`isInterrupted()`实现 2. 不要使用已废弃的`stop()`方法强制终止线程 3. 正确处理`InterruptedException`的两种方式: - 传播异常(`throw new RuntimeException(e)`) - 保留中断状态(调用`interrupt()`恢复标志)[^3] 4. 中断状态可通过以下方法检查: ```java Thread.currentThread().isInterrupted() // 不重置状态 Thread.interrupted() // 返回当前状态并重置标志 ``` #### 五、典型应用场景 1. 终止长时间运行的任务 2. 取消阻塞操作(如网络I/O等待) 3. 实现优雅的线程关闭机制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值