真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何理解Volatile+Interrupt是停止線(xiàn)程優(yōu)雅的姿勢(shì)

本篇內(nèi)容主要講解“如何理解Volatile+Interrupt是停止線(xiàn)程優(yōu)雅的姿勢(shì)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何理解Volatile+Interrupt是停止線(xiàn)程優(yōu)雅的姿勢(shì)”吧!

創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專(zhuān)注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開(kāi)發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開(kāi)發(fā),軟件開(kāi)發(fā),成都小程序開(kāi)發(fā),十載建站對(duì)iso認(rèn)證等多個(gè)行業(yè),擁有豐富設(shè)計(jì)經(jīng)驗(yàn)。

使用stop方法

調(diào)用stop方法,會(huì)讓正在運(yùn)行的線(xiàn)程直接中止,有可能會(huì)讓一些清理性的工作得不到完成。并且stop已經(jīng)被標(biāo)記為廢棄的方法,不建議使用。

正確的使用姿勢(shì)是使用兩階段終止的模式,即一個(gè)線(xiàn)程發(fā)送終止指令,另一個(gè)線(xiàn)程接收指令,并且決定自己在何時(shí)停止。

使用標(biāo)志位

public class RunTask {      private volatile boolean stopFlag;     private Thread taskThread;      public void start() {         taskThread = new Thread(() -> {             while (!stopFlag) {                 System.out.println("doSomething");             }         });         taskThread.start();     }      public void stop() {         stopFlag = true;     } }

「stopFlag上加volatile是保證可見(jiàn)性。我這個(gè)例子用了while循環(huán)不斷判斷,如果項(xiàng)目中用不到while的話(huà),可以在關(guān)鍵節(jié)點(diǎn)判斷,然后退出run方法即可」

使用interrupt方法

假如我們的任務(wù)中有阻塞的邏輯,如調(diào)用了Thread.sleep方法,如何讓線(xiàn)程停止呢?

從線(xiàn)程狀態(tài)轉(zhuǎn)換圖中尋找答案

如何理解Volatile+Interrupt是停止線(xiàn)程優(yōu)雅的姿勢(shì)

從圖中可以看到如果想讓線(xiàn)程進(jìn)入終止?fàn)顟B(tài)的前提是這個(gè)線(xiàn)程處于運(yùn)行狀態(tài)。當(dāng)我們想要終止一個(gè)線(xiàn)程的時(shí)候,如果此時(shí)線(xiàn)程處于阻塞狀態(tài),我們?nèi)绾伟阉D(zhuǎn)換到運(yùn)行狀態(tài)呢?

我們可以通過(guò)調(diào)用Thread#interrupt方法,將阻塞狀態(tài)的線(xiàn)程轉(zhuǎn)換到就緒狀態(tài),進(jìn)入由操作系統(tǒng)調(diào)度成運(yùn)行狀態(tài),即可終止。

那線(xiàn)程在運(yùn)行狀態(tài)中調(diào)用interrupt方法,會(huì)發(fā)生什么呢?

public class RunTaskCase1 {      private Thread taskThread;      public void start() {         taskThread = new Thread(() -> {             while (true) {                 System.out.println("doSomething");             }         });         taskThread.start();     }      public void stop() {         taskThread.interrupt();     } }

依次調(diào)用start方法和stop方法,發(fā)現(xiàn)線(xiàn)程并沒(méi)有停止。

「其實(shí)當(dāng)線(xiàn)程處于運(yùn)行狀態(tài)時(shí),interrupt方法只是在當(dāng)前線(xiàn)程打了一個(gè)停止的標(biāo)記,停止的邏輯需要我們自己去實(shí)現(xiàn)」

「Thread類(lèi)提供了如下2個(gè)方法來(lái)判斷線(xiàn)程是否是中斷狀態(tài)」

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. isInterrupted

  3. interrupted

這2個(gè)方法雖然都能判斷狀態(tài),但是有細(xì)微的差別

@Test public void testInterrupt() throws InterruptedException {     Thread thread = new Thread(() -> {         while (true) {}     });     thread.start();     TimeUnit.MICROSECONDS.sleep(100);     thread.interrupt();     // true     System.out.println(thread.isInterrupted());     // true     System.out.println(thread.isInterrupted());     // true     System.out.println(thread.isInterrupted()); }
@Test public void testInterrupt2() {     Thread.currentThread().interrupt();     // true     System.out.println(Thread.interrupted());     // false     System.out.println(Thread.interrupted());     // false     System.out.println(Thread.interrupted()); }

「isInterrupted和interrupted的方法區(qū)別如下」

Thread#isInterrupted:測(cè)試線(xiàn)程是否是中斷狀態(tài),執(zhí)行后不更改狀態(tài)標(biāo)志  Thread#interrupted:測(cè)試線(xiàn)程是否是中斷狀態(tài),執(zhí)行后將中斷標(biāo)志更改為false

「所以此時(shí)我們不需要自已定義狀態(tài),直接用中斷標(biāo)志即可,之前的代碼可以改為如下」

public class RunTaskCase2 {      private Thread taskThread;      public void start() {         taskThread = new Thread(() -> {             while (!Thread.currentThread().isInterrupted()) {                 System.out.println("doSomething");             }         });         taskThread.start();     }      public void stop() {         taskThread.interrupt();     } }

當(dāng)線(xiàn)程處于阻塞狀態(tài)時(shí),調(diào)用interrupt方法,會(huì)拋出InterruptedException,也能終止線(xiàn)程的執(zhí)行

「注意:發(fā)生異常時(shí)線(xiàn)程的中斷標(biāo)志為會(huì)由true更改為false?!?/strong>

所以我們有如下實(shí)現(xiàn) 當(dāng)線(xiàn)程處于運(yùn)行狀態(tài):用自己定義的標(biāo)志位來(lái)退出 當(dāng)線(xiàn)程處于阻塞狀態(tài):用拋異常的方式來(lái)退出

public class RunTaskCase3 {      private volatile boolean stopFlag;     private Thread taskThread;      public void start() {         taskThread = new Thread(() -> {             while (stopFlag) {                 try {                     System.out.println("doSomething");                     TimeUnit.MICROSECONDS.sleep(100);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }             }         });         taskThread.start();     }      public void stop() {         stopFlag = true;         taskThread.interrupt();     } }

當(dāng)然也可以一直用中斷標(biāo)志來(lái)退出,「注意,當(dāng)發(fā)生異常的時(shí)候需要重置中斷標(biāo)志位」。

public class RunTaskCase4 {      private Thread taskThread;      public void start() {         taskThread = new Thread(() -> {             while (!Thread.currentThread().isInterrupted()) {                 try {                     System.out.println("doSomething");                     TimeUnit.MICROSECONDS.sleep(100);                 } catch (InterruptedException e) {                     // 重置中斷標(biāo)志位為true                     Thread.currentThread().interrupt();                     e.printStackTrace();                 }             }         });         taskThread.start();     }      public void stop() {         taskThread.interrupt();     } }

到此,相信大家對(duì)“如何理解Volatile+Interrupt是停止線(xiàn)程優(yōu)雅的姿勢(shì)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!


新聞標(biāo)題:如何理解Volatile+Interrupt是停止線(xiàn)程優(yōu)雅的姿勢(shì)
文章路徑:http://weahome.cn/article/pjjsis.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部