摘要:一定義我們將線程的正常處理狀態(tài)稱為作業(yè)中,當(dāng)希望結(jié)束這個(gè)線程時(shí),則送出終止請求。計(jì)數(shù)線程類執(zhí)行三模式講解模式的角色如下參與者參與者用于調(diào)用終止請求。參與者擁有一個(gè)標(biāo)識門閂表示是否已經(jīng)收到終止請求
一、定義
我們將線程的正常處理狀態(tài)稱為“作業(yè)中”,當(dāng)希望結(jié)束這個(gè)線程時(shí),則送出“終止請求”。接著,這個(gè)線程并不會立刻結(jié)束,而是進(jìn)入“終止處理中”狀態(tài),此時(shí)線程還是運(yùn)行著的,可能處理一些釋放資源等操作。直到終止處理完畢,才會真正結(jié)束。
Two-phase Termination主要考慮以下問題:
安全地結(jié)束(安全性);
一定會進(jìn)行終止處理(生命性);
收到“終止請求”后,要盡快進(jìn)行終止處理(響應(yīng)性);
二、模式案例該案例中,線程每隔500ms將計(jì)數(shù)器增加1,在大約10s后結(jié)束。
計(jì)數(shù)線程類:
</>復(fù)制代碼
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);
}
}
執(zhí)行:
</>復(fù)制代碼
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參與者用于調(diào)用終止請求。(案例中的Main類)
Terminator參與者
Terminator參與者接受終止請求,進(jìn)行實(shí)際的終止處理,提供shutdownRequest終止方法供外界調(diào)用。
Terminator參與者擁有一個(gè)標(biāo)識(門閂)表示是否已經(jīng)收到終止請求
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/71508.html
摘要:文本將介紹兩種可以優(yōu)雅的終止線程的方式第一種在多線程模式中有一種叫兩步終止的模式可以優(yōu)雅的終止線程,這種模式采用了兩個(gè)步驟來終止線程,所以叫兩步終止模式。 Java中原來在Thread中提供了stop()方法來終止線程,但這個(gè)方法是不安全的,所以一般不建議使用。文本將介紹兩種可以優(yōu)雅的終止線程的方式... 第一種 在JAVA《Java多線程模式》中有一種叫Two-Phase Term...
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領(lǐng)域優(yōu)質(zhì)創(chuàng)作者哪吒公眾號作者架構(gòu)師奮斗者掃描主頁左側(cè)二維碼,加入群聊,一起學(xué)習(xí)一起進(jìn)步歡迎點(diǎn)贊收藏留言前情提要無意間聽到領(lǐng)導(dǎo)們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨(dú)立帶隊(duì)的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:原文出處設(shè)計(jì)的一個(gè)重要目標(biāo)是設(shè)置階段的持續(xù)時(shí)長和頻率,因?yàn)槔占骺深A(yù)測,可配置。收集器盡自己最大努力高概率實(shí)現(xiàn)目標(biāo)但不是必然,它會是硬實(shí)時(shí)。因此名稱是收集器。運(yùn)行不同使用獨(dú)立的收集器。 原文出處:G1 – Garbage First G1設(shè)計(jì)的一個(gè)重要目標(biāo)是設(shè)置stop-the-world階段的持續(xù)時(shí)長和頻率,因?yàn)槔占骺深A(yù)測,可配置。事實(shí)上,G1是一款軟實(shí)時(shí)的收集器,意味著你...
摘要:基礎(chǔ)系列的與方法類初始化順序線程池如何彈性伸縮的幾個(gè)要點(diǎn)的緩存什么場景下使用阻塞隊(duì)列的使用及模式中的序本文主要分析線程池是如何進(jìn)行線程的彈性伸縮。線程池最小是,最大是,除非設(shè)置了和超時(shí)時(shí)間,這種情況線程數(shù)可能減少到,最大可能是。 Java基礎(chǔ)系列 Java的hashcode與equals方法 Java類初始化順序 ThreadPoolExecutor線程池如何彈性伸縮 HashMap...
摘要:本身不直接支持指針的操作,所以這也是該類命名為的原因之一。中的許多方法,內(nèi)部其實(shí)都是類在操作。 showImg(https://segmentfault.com/img/remote/1460000016012251); 本文首發(fā)于一世流云的專欄:https://segmentfault.com/blog... 一、Unsafe簡介 在正式的開講 juc-atomic框架系列之前,有...
閱讀 3064·2023-04-26 00:49
閱讀 3728·2021-09-29 09:45
閱讀 993·2019-08-29 18:47
閱讀 2749·2019-08-29 18:37
閱讀 2732·2019-08-29 16:37
閱讀 3298·2019-08-29 13:24
閱讀 1780·2019-08-27 10:56
閱讀 2352·2019-08-26 11:42
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要