复习 - 并发 - 设计模式
1.模式之两阶段终止
在一个线程 T1 中怎样 等线程T2料理后事后,才杀死T2?
不可采取:
-
使用线程对象的 stop() 方法停止线程:
- stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释放锁,其它线程将永远无法获取锁
-
使用 System.exit(int) 方法停止线程
- 会让整个程序都停止
思路:
public class TPTInterrupt {
Logger log = Logger.getLogger("info");
private Thread thread;
public void start() {
thread = new Thread(() -> {
while (true) {
// 获取当前正在执行的线程
Thread current = Thread.currentThread();
// 判断当前线程有无被打断(即打断标识 = true表示被打断了,料理后事)
if (current.isInterrupted()) {
// 阻塞被打断时为false,我们只需要捕获异常,然后设置为true就行
log.info("料理后事");
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 如果在阻塞时被打断,则会抛出异常,且打断标识为false
// 我们只需要重置打断标识为true,则下次进入循环时会直接退出
current.interrupt();
}
// TODO 监控
}
}, "监控");
thread.start();
}
public void stop() {
thread.interrupt();
}
@Test
public void test01() throws InterruptedException {
TPTInterrupt t =new TPTInterrupt();
t.start();
Thread.sleep(3500);
t.stop();
}
}
2. 同步模式之保护性暂停
1.定义
用在一个线程等待另一个线程的执行结果
2.要点
- 有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject
- 如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)
- JDK 中,join 的实现、Future 的实现,采用的就是此模式
- 因为要等待另一方的结果,因此归类到同步模式
;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构