没有合适的资源?快使用搜索试试~ 我知道了~
16、常用并发设计模式精讲(1).pdf
需积分: 0 1 下载量 170 浏览量
2024-02-28
14:59:59
上传
评论
收藏 974KB PDF 举报
温馨提示
试读
23页
11-线程池 ThreadPoolExecutor 底层原理源码分析(上)-周瑜.pdf 12-线程池 ThreadPoolExecutor底层原理源码分析(下)-周瑜.pdf 13、线程池 ForkJoinPool实战及其工作原理分析 (1).pdf 14、深入理解井发可见性、有序性、原子性与JMM内存模型 (1).pdf 15、CPU缓存架构详解&高性能内存队列Disruptor 实战 (1).pdf 16、常用并发设计模式精讲 (1).pdf designpattern.zip disruptor.zip forkjoin.zip jmm(1).zip
资源推荐
资源详情
资源评论
主讲老师: Fox
有道笔记地址:
跳出来,看全局;钻进去,看本质
思考:在一个线程 T1 中如何优雅的终止线程 T2?
错误思路1:使用线程对象的 stop() 方法停止线程
stop 方法会真正杀死线程,如果这时线程锁住了共享资源,那么当它被杀死后就再也没有机会释
放锁, 其它线程将永远无法获取锁 。
错误思路2:使用 System.exit(int) 方法停止线程
目的仅是停止一个线程,但这种做法会让整个程序都停止
正确思路:两阶段终止模式
https://note.youdao.com/s/7z81m2sx
常用并发设计模式
https://www.processon.com/view/link/615d4a610e3e74663e97fa0e
1. 优雅终止线程的设计模式
1.1 两阶段终止(Two-phase Termination)模式——优雅的终止线程
两阶段终止(Two-phase Termination)模式是一种用于优雅终止线程的设计模式。该模式的基
本思想是通过两个阶段来终止线程,第一个阶段是发送终止请求,第二个阶段是等待线程终止。
思考:第一阶段,在Java中如何发送终止请求?
回顾一下Java线程的生命周期:
Java 线程进入终止状态的前提是线程进入 RUNNABLE 状态,而实际上线程也可能处在休眠状
态,也就是说,我们要想终止一个线程,首先要把线程的状态从休眠状态转换到 RUNNABLE 状态。
利用java线程中断机制的interrupt() 方法,可以让线程从休眠状态转换到RUNNABLE 状态。
思考:第二阶段,线程转换到 RUNNABLE 状态之后,我们如何再将其终止呢?
RUNNABLE 状态转换到终止状态,优雅的方式是让 Java 线程自己执行完 run() 方法,所以一般
我们采用的方法是设置一个标志位,然后线程会在合适的时机检查这个标志位,如果发现符合终止条
件,则自动退出 run() 方法。
综合上面这两点,我们能总结出终止指令,其实包括两方面内容:interrupt() 方法和线程终止的
标志位。
两阶段终止模式可以带来多种好处,例如:
优雅终止:两阶段终止模式可以优雅地终止线程,避免突然终止线程带来的副作用。
安全性:两阶段终止模式可以在线程终止前执行必要的清理工作,以确保程序的安全性和稳定性。
灵活性:两阶段终止模式可以根据具体情况灵活地设置终止条件和清理工作。
1.
2.
3.
两阶段终止模式适用于需要优雅终止线程的场景,例如:
总之,两阶段终止模式适用于需要优雅终止线程的各种场景,可以提高程序的可靠性和可维护性。在
应用该模式时,需要注意正确设计终止条件和清理工作,以避免出现线程安全问题和资源泄漏问题。
在多线程程序中,如果有一些线程需要执行长时间的监控或者轮询操作,可以使用两阶段终止模式来
终止这些线程的执行。使用两阶段终止模式可以保证监控线程在执行终止操作时能够安全地释放资源
和退出线程。同时,该模式还可以保证监控线程在终止前能够完成必要的清理工作,从而避免资源泄
露和其他问题。
1.2 使用场景
服务器应用程序:在服务器应用程序中,需要处理大量的请求和数据,并且需要在终止时正确地保存和释放资
源,以避免数据丢失和资源泄漏。
大规模并发系统:在大规模并发系统中,线程数量可能非常多,并且需要在终止时正确地关闭和释放所有的线程
和资源。
定时任务系统:在定时任务系统中,需要在任务执行完毕后正确地终止任务线程,并清理相关资源。
数据处理系统:在数据处理系统中,需要在处理完所有数据后正确地终止线程,并清理相关资源。
消息订阅系统:在消息订阅系统中,需要在订阅结束后正确地终止订阅线程,并清理相关资源。
利用两阶段终止模式设计优雅终止监控操作
public class MonitorThread extends Thread {1
//在监控线程中添加一个volatile类型的标志变量,用于标识是否需要终止线程的执行2
private volatile boolean terminated = false;3
4
public void run() {5
while (!terminated) {6
// 执行监控操作7
System.out.println("监控线程正在执行监控操作...");8
try {9
Thread.sleep(1000);10
} catch (InterruptedException e) {11
e.printStackTrace();12
}13
}14
// 执行清理操作15
System.out.println("监控线程正在执行清理操作...");16
releaseResources();17
}18
1.
2.
3.
4.
5.
在使用两阶段终止模式终止线程的同时,还可以结合中断机制实现更加可靠和灵活的线程终止操作。
使用中断机制可以让线程在终止前及时响应中断请求,并退出线程的阻塞状态。同时,还可以通过检
查中断状态和标志变量的状态来判断是否需要终止线程的执行,从而实现更加可靠和灵活的线程终止
操作。
19
public void terminate() {20
//设置标志变量为true,并等待一段时间21
terminated = true;22
try {23
join(5000); // 等待5秒钟,期间监控线程会检查terminated的状态24
} catch (InterruptedException e) {25
e.printStackTrace();26
}27
}28
29
private void releaseResources() {30
// 释放资源和进行必要的清理工作31
System.out.println("监控线程正在释放资源和进行必要的清理工作...");32
}33
34
public static void main(String[] args) throws InterruptedException {35
MonitorThread thread = new MonitorThread();36
//启动监控线程37
thread.start();38
//主线程休眠期间,监控线程在执行监控操作39
Thread.sleep(10000);40
//终止监控线程41
thread.terminate();42
43
44
Thread.sleep(100000);45
}46
}47
public class MonitorThread2 extends Thread {1
//在监控线程中添加一个volatile类型的标志变量,用于标识是否需要终止线程的执行2
private volatile boolean terminated = false;3
4
public void run() {5
while (!Thread.interrupted()&&!terminated) {6
// 执行监控操作7
System.out.println("监控线程正在执行监控操作...");8
try {9
Thread.sleep(1000);10
} catch (InterruptedException e) {11
System.out.println("监控线程被中断,准备退出...");12
Thread.currentThread().interrupt();13
e.printStackTrace();14
}15
}16
// 执行清理操作17
System.out.println("监控线程正在执行清理操作...");18
releaseResources();19
}20
21
public void terminate() {22
//设置标志变量为true,并等待一段时间23
terminated = true;24
try {25
join(5000); // 等待5秒钟,期间监控线程会检查terminated的状态26
} catch (InterruptedException e) {27
e.printStackTrace();28
}29
}30
31
private void releaseResources() {32
// 释放资源和进行必要的清理工作33
System.out.println("监控线程正在释放资源和进行必要的清理工作...");34
}35
36
public static void main(String[] args) throws InterruptedException {37
MonitorThread2 thread = new MonitorThread2();38
//启动监控线程39
thread.start();40
//主线程休眠期间,监控线程在执行监控操作41
Thread.sleep(10000);42
//为监控线程设置中断标志位43
thread.interrupt();44
剩余22页未读,继续阅读
资源评论
代码匠心印记
- 粉丝: 483
- 资源: 30
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功