Java多线程基础(十二)——Two-phase Termination模式

1、定义

咱们将线程的正常处理状态称为“做业中”,当但愿结束这个线程时,则送出“终止请求”。接着,这个线程并不会马上结束,而是进入“终止处理中”状态,此时线程仍是运行着的,可能处理一些释放资源等操做。直到终止处理完毕,才会真正结束。安全

Two-phase Termination主要考虑如下问题:spa

  • 安全地结束(安全性);
  • 必定会进行终止处理(生命性);
  • 收到“终止请求”后,要尽快进行终止处理(响应性);

2、模式案例

该案例中,线程每隔500ms将计数器增长1,在大约10s后结束。线程

计数线程类:code

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 (!shutdownRequested) {
                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);
    }
}

执行:blog

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: shutdownRequest");
            t.shutdownRequest();
            System.out.println("main: join");
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main: END");
    }
}

3、模式讲解

Two-phase Termination模式的角色以下:资源

  • TerminationRequester参与者

TerminationRequester参与者用于调用终止请求。(案例中的Main类)rem

  • Terminator参与者

Terminator参与者接受终止请求,进行实际的终止处理,提供shutdownRequest终止方法供外界调用。
Terminator参与者拥有一个标识(门闩)表示是否已经收到终止请求it

相关文章
相关标签/搜索