Two-Phase-Termination模式

Two-Phase-Termination模式

该模式的名字直译为中文是“分两段终止”的意思。它是一种先执行完终止处理再终止线程的模式。

我们称线程在进行正常处理时的状态为“操作中”。在要停止该线程时,我们会发出“终止请求”。这样,线程就不会突然终止,而是会先开始进行“打扫工作”。我们称这种状态为“终止处理中”。从“操作中”变为“终止处理中”是线程终止的第一阶段。

在“终止处理中”状态下,线程不会再进行正常操作了。它虽然仍然在运行,但是只会进行终止处理。终止处理完成后,就会真正地终止线程。“终止处理中”状态结束时线程终止的第二阶段。

先从“操作中”变为“终止处理中”状态,然后再真正地终止线程。

该模式的要点如下:

  1. 安全地终止线程(安全性)
  2. 必定会进行终止处理(生存型)
  3. 发出终止请求后尽快进行终止处理(响应性)

示例程序

类的一览表

名字 说明
CountupThread 表示进行计数的线程的类。
Main 测试程序行为的类

CountupThread类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class CountupThread extends Thread {

private long counter = 0;

private volatile boolean shudownRequested = false;

public void shutdownRequest() {
shudownRequested = true;
interrupt();
}

public boolean isShutdownRequested() {
return shudownRequested;
}

public final void run() {
try {
while (!isShutdownRequested()) {
doWork();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
doShutdown();
}
}

private void doWork() throws InterruptedException {
counter++;
System.out.println("DoWork: counter = " + counter);
Thread.sleep(500);
}

private void doShutdown() {
System.out.println("Do shutdown : counter = " + counter);
}

}

Main类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Main {
public static void main(String[] args) {
System.out.println("Main begin");
try {
CountupThread t = new CountupThread();
t.start();
Thread.sleep(10000);

System.out.println("Main shutdown request");
t.shutdownRequest();
System.out.println("main join");
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main end");
}
}

0%