InterruptedException的解读

本文详细介绍了Java中线程中断机制的原理,包括中断变量的作用、线程中断的过程以及如何使用Thread.interrupt()方法中断线程。并通过一个具体的实例展示了如何在多线程程序中正确地利用中断机制。
最近写了些多线程的程序,用Thread.sleep()的时候有时会碰到InterruptedException。查了一些资料,下面是我自己的一些理解。
阻塞方法
一些多线程相关的方法是阻塞方法,比如Thread.sleep(), Thread.wait(), Thread.join()。
这些方法的执行通常需要比较长的时间来完成,当代码执行到阻塞方法时,一般要等待该方法返回后
才能继续往下执行,而InterruptedException提供了一种特殊的机制提前结束阻塞方法。
中断变量
每个线程都会维护一个bool变量,表示线程处于中断(true)或者非中断状态(false)。在线程初始的情况下中断变量为false。
这个变量的bool值可以通过Thread.isInterrupted()方法来读取,通过Thread.interrupted()方法来清除中断(即将中断变量置为false)。
线程中断
一个线程可以通过调用Thread.interrupt()方法来中断另外一个线程,具体过程如下:
1. 中断变量被设置为true。
2. 如果线程执行到了阻塞方法,那么该方法取消阻塞,并将中断变量重新置为false。
(这种机制是通过阻塞方法内部不断轮询中断变量的值来实现的)
例子:
class ThreadTest implements Runnable {

	@Override
	public void run() {
		System.out.println("before sleep");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			System.out.println(Thread.currentThread().getName());
			Thread.currentThread().interrupt();
			System.out.println("after interrupt");
		}
		System.out.println("after sleep");

		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
			System.out.println(Thread.currentThread().getName());
			Thread.currentThread().interrupt();
			System.out.println("after interrupt");
		}
		System.out.println("after sleep");
	}
}
public class ThreadBasic {
	public static void main(String[] args) {
		Thread t = new Thread(new ThreadTest(), "thread-1");
		t.start();
		t.interrupt();
		System.out.println(t.isInterrupted());
	}
}

运行结果:
true
before sleep
thread-1
after interrupt
after sleep
thread-1
after interrupt
after sleep

来自:http://www.blogjava.net/neverend/archive/2011/06/14/352310.html


### 关于源码解读、分析的文章和教程 #### FastGPT 流程编排相关源码 FastGPT 的流程编排涉及的知识库相关内容已经在之前的文档中有所提及[^1]。本文档进一步深入探讨了流程编排的具体实现细节,适合希望了解其内部工作机制的技术人员。 #### Redisson 功能与源码剖析 Redisson 是一款基于 Redis 的 Java 客户端工具包,提供了丰富的分布式对象和服务支持。以下是 Redisson 源码分析的主要内容概览: - **前言回顾**:介绍了 Redisson 的背景及其与其他 Redis 工具的区别。 - **功能介绍**:涵盖了 Redisson 提供的核心功能,如分布式锁、集合等[^2]。 - **可重入锁原理及其实现**:详细描述了 Redisson 如何通过 WatchDog 和重试机制来管理分布式锁的状态。 - **MultiLock 实现原理**:解释了如何利用多个锁协同工作以满足复杂的并发控制需求。 #### DataX 架构设计与运行流程解析 DataX 是阿里巴巴开源的一款异构数据源离线同步工具,具有高度灵活性和扩展性。它的核心设计理念如下: - **Framework + Plugin 架构**:将不同数据源的读取和写入操作抽象成独立的 Reader 和 Writer 插件[^3]。 - **具体组件职责划分**: - `Reader` 负责从源头获取数据并传递至 Framework 层。 - `Writer` 接收来自 Framework 的数据并将之存储到目标位置。 - `Framework` 则充当桥梁角色,协调两端通信的同时完成诸如缓冲区管理、流量控制等功能。 对于开发者而言,理解这些项目的底层逻辑有助于更高效地运用它们解决实际问题;同时也能够针对特定场景定制化开发新特性或者优化现有性能瓶颈点。 ```java // 示例代码展示 Redisson 可重入锁基本用法 import org.redisson.api.RLock; import org.redisson.api.RedissonClient; public class DistributedLockExample { private final RedissonClient redissonClient; public void acquireAndReleaseLock(String lockName) throws InterruptedException { RLock lock = redissonClient.getLock(lockName); try { boolean isLocked = lock.tryLock(10, 30, TimeUnit.SECONDS); // 尝试加锁,等待时间最长为10秒,持有时间为30秒 if (isLocked) { System.out.println("成功获得锁!"); Thread.sleep(5000); // Simulate some work System.out.println("释放锁..."); } else { System.err.println("未能获取锁"); } } finally { lock.unlock(); // 确保无论发生什么都解锁资源 } } } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值