(十二)Two-phase Termination模式

一、定义

我们将线程的正常处理状态称为“作业中”,当希望结束这个线程时,则送出“终止请求”。接着,这个线程并不会立刻结束,而是进入“终止处理中”状态,此时线程还是运行着的,可能处理一些释放资源等操作。直到终止处理完毕,才会真正结束。

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

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

 

 

二、案例模式

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

 

计数线程类:

public class CountupThread extends Thread{
    private long counter = 0;
    private volatile boolean shutdownRequested = false;

    public void showdownRequest() {
        shutdownRequested = true;
        interrupt();
    }

    public boolean isShutdownRequested() {
        return shutdownRequested;
    }

    @Override
    public final void run() {

        try {
            while (!shutdownRequested) {
                doWork();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            doShutdown();
        }

    }

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

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

 

执行

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: showdownRequest");
            t.showdownRequest();
            System.out.println("main: join");
            //join方法把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。
            //比如在线程Main中调用了Countup线程的join方法,知道Countup线程执行完毕后,才会继续执行线程Main
            //这里使用join方法是为了打印顺序
            t.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main: END");

    }
}

 

 

 

 

三、模式讲解

Two-phase Termination模式的角色如下:

  • TerminationRequester

用于调用终止请求。

  • Terminator

接受终止请求,进行实际的终止处理,提供showdownRequest终止方法供外界调用。Terminator拥有一个标识表示是否已经收到终止请求。

 

 

 

 

借鉴学习自https://segmentfault.com/a/1190000015558833

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值