概述
“分两个阶段终止”的意思是一先执行完终止处理再终止线程的模式,通俗的比喻是“先收拾房间再睡觉”。
线程进行正常处理时的状态为“操作中”。要停止该线程,我们会发出“终止请求”。这样,线程就不会突然终止,而是先开始进行“打扫工作”。我们称这种状态为“终止处理中”。
从“操作中”变为“终止处理中”是线程终止的第一个阶段。
在”终止处理中“状态下,线程不会再进行正常操作了。它虽然仍然在运行,但是只进行终止处理。终止处理完成后,就会真正地终止线程。”终止处理中“状态结束是线程终止的第二阶段。
先从”操作中“状态变为”终止处理中“状态,然后再真正地终止线程。这就是Two-Phase Termination模式。
示例程序
- CountupThread 表示进行技术的线程类
- Main 测试程序行为的类
CountupThread 类
public class CountupThread extends Thread {
private long counter = 0;
private volatile boolean shutdownRequested = false;
public void shutdownRequest() {
shutdownRequested = true;
interrupt();
}
public boolean isShutdownRequested(){
return shutdownRequested;
}
public final void run() {
try{
while(!isShutdownRequested()){
doWork();
}
} catch (InterruptedException e){
} finally { doShutdown();}
}
private void doWork() throws InterruptedException {
counter++;
System.out.println("doWork: counter = " + counter);
Thread.sleep(500);
}
private void doShutdown(){
System.out.println("doShutdown: counter = " + counter);
}
}
Main 类
public class Main {
public static void main(String[] args){
System.out.println("main: BEGIN");
try{
//启动线程
CountupThread t = new CountupThread();
t.start();
//稍微间隔一段时间
Thread.sleep(1000);
//线程的终止请求
System.out.println("main: shutdownRequest");
t.shutDownRequest();
System.out.println("main: shutdownRequest");
System.out.println("main: join");
//等待线程终止
t.join();
} catch(InterruptedException e){
e.printStackTrace();
};
System.out.println("main: END");
}
}
Two Phase Termination 模式的角色
- TerminationRequester(终止请求发出者)
- Terminator (终止者)