目录
一、两阶段终止模式说明 二、错误思路 三、实现思路图 四、实现思路 五、方法说明 六、interrupt实现
七、volatile实现
一、两阶段终止模式说明
1.在一个线程t1中优雅地终止另一个线程t2,指终止t2线程前,让t2线程有一个料理后事的机会
二、错误思路
1.使用线程对象的stop方法停止线程 2.stop方法会真正杀死线程,如果线程锁住了共享资源,杀死该线程后再也没有机会释放锁,其它线程将永远无法获取锁 3.使用System.exit(int)方法停止线程 4.如果只想停止某个线程,System.exit方法会让整个程序都停止
三、实现思路图
四、实现思路
1.while(true)死循环 2.判断有没有被打断,如果被打断,料理后事,结束循环 3.如果没有被打断,睡眠2秒,睡眠期间没有异常,执行操作,继续循环 4.睡眠期间有异常,设置打断标记,抓住异常,并重置打断标记,继续循环,判断被打断了,料理后事,结束循环
五、方法说明
1.isInterrupted() 判断是否被打断,不会清除打断标记 2.interrupt() 打断线程,如果被打断的线程正在sleep、wait、join会导致被打断的线程抛出InterruptedException异常,并清除打断标记;如果被打断正在运行的线程,则会设置打断标记;park的线程被打断也会设置打断标记 3.interrupted() 判断当前线程是否被打断,会清除打断标记
六、interrupt实现
6.1 代码示例
package com.learning.interrupt;
import lombok.extern.slf4j.Slf4j;
/**
* @Description 两阶段终止模式
*/
@Slf4j
public class TwoPhaseTermination {
// 监控线程
private Thread monitorThread;
// 启动监控线程
public void start(){
monitorThread = new Thread(()->{
while(true){
Thread thread = Thread.currentThread();
if(thread.isInterrupted()){
log.info("料理后事");
break;
}
try {
// 睡眠期间被打断
Thread.sleep(1000);
// 执行监控操作被打断
log.info("执行监控操作");
} catch (InterruptedException e) {
e.printStackTrace();
// 重新设置打断标记 为true
thread.interrupt();
}
}
});
monitorThread.start();
}
// 停止监控线程
public void stop(){
monitorThread.interrupt();
}
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination twoPhaseTermination = new TwoPhaseTermination();
twoPhaseTermination.start();
Thread.sleep(3500);
twoPhaseTermination.stop();
}
}
6.2 示例截图
七、volatile实现
7.1 代码示例
package com.learning.interrupt;
import lombok.extern.slf4j.Slf4j;
/**
* @Author Jun.Wang
* @Date 2023/5/25 14:32
* @Description 两阶段终止模式 volatile
*/
@Slf4j
public class TwoPhaseTermination_Volatile {
// 监控线程
private Thread monitorThread;
private volatile boolean stop;
// 启动监控线程
public void start(){
monitorThread = new Thread(()->{
while(true){
if(this.stop){
log.info("料理后事");
break;
}
try {
// 睡眠期间被打断
Thread.sleep(1000);
// 执行监控操作被打断
log.info("执行监控操作");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
monitorThread.start();
}
// 停止监控线程
public void stop(){
this.stop = true;
monitorThread.interrupt();
}
public static void main(String[] args) throws InterruptedException {
TwoPhaseTermination_Volatile twoPhaseTermination = new TwoPhaseTermination_Volatile();
twoPhaseTermination.start();
Thread.sleep(3500);
twoPhaseTermination.stop();
}
}
7.2 示例截图