资讯专栏INFORMATION COLUMN

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

cheng10 / 1214人阅读

摘要:一定义我们将线程的正常处理状态称为作业中,当希望结束这个线程时,则送出终止请求。计数线程类执行三模式讲解模式的角色如下参与者参与者用于调用终止请求。参与者拥有一个标识门闩表示是否已经收到终止请求

一、定义

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

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

安全地结束(安全性);

一定会进行终止处理(生命性);

收到“终止请求”后,要尽快进行终止处理(响应性);

二、模式案例

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

计数线程类:

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);
    }
}

执行:

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");
    }
}
三、模式讲解

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

TerminationRequester参与者

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

Terminator参与者

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/71508.html

相关文章

  • 一起学并发编程 - 优雅关闭

    摘要:文本将介绍两种可以优雅的终止线程的方式第一种在多线程模式中有一种叫两步终止的模式可以优雅的终止线程,这种模式采用了两个步骤来终止线程,所以叫两步终止模式。 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用。文本将介绍两种可以优雅的终止线程的方式... 第一种 在JAVA《Java多线程模式》中有一种叫Two-Phase Term...

    曹金海 评论0 收藏0
  • Java学习路线总结,搬砖工逆袭Java架构师(全网最强)

    摘要:哪吒社区技能树打卡打卡贴函数式接口简介领域优质创作者哪吒公众号作者架构师奋斗者扫描主页左侧二维码,加入群聊,一起学习一起进步欢迎点赞收藏留言前情提要无意间听到领导们的谈话,现在公司的现状是码农太多,但能独立带队的人太少,简而言之,不缺干 ? 哪吒社区Java技能树打卡 【打卡贴 day2...

    Scorpion 评论0 收藏0
  • 译文-G1收集器

    摘要:原文出处设计的一个重要目标是设置阶段的持续时长和频率,因为垃圾收集器可预测,可配置。收集器尽自己最大努力高概率实现目标但不是必然,它会是硬实时。因此名称是收集器。运行不同使用独立的收集器。 原文出处:G1 – Garbage First G1设计的一个重要目标是设置stop-the-world阶段的持续时长和频率,因为垃圾收集器可预测,可配置。事实上,G1是一款软实时的收集器,意味着你...

    missonce 评论0 收藏0
  • ThreadPoolExecutor线程池如何弹性伸缩

    摘要:基础系列的与方法类初始化顺序线程池如何弹性伸缩的几个要点的缓存什么场景下使用阻塞队列的使用及模式中的序本文主要分析线程池是如何进行线程的弹性伸缩。线程池最小是,最大是,除非设置了和超时时间,这种情况线程数可能减少到,最大可能是。 Java基础系列 Java的hashcode与equals方法 Java类初始化顺序 ThreadPoolExecutor线程池如何弹性伸缩 HashMap...

    hersion 评论0 收藏0
  • Java线程进阶(十二)—— J.U.C之atomic框架:Unsafe类

    摘要:本身不直接支持指针的操作,所以这也是该类命名为的原因之一。中的许多方法,内部其实都是类在操作。 showImg(https://segmentfault.com/img/remote/1460000016012251); 本文首发于一世流云的专栏:https://segmentfault.com/blog... 一、Unsafe简介 在正式的开讲 juc-atomic框架系列之前,有...

    赵连江 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<