日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java sleep方法_一文搞懂 Java 线程中断!

發(fā)布時(shí)間:2023/12/10 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java sleep方法_一文搞懂 Java 线程中断! 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在之前的一文《如何”優(yōu)雅”地終止一個(gè)線程》詳細(xì)說明了 stop 終止線程的壞處及如何優(yōu)雅地終止線程,那么還有別的可以終止線程的方法嗎?答案是肯定的,它就是我們今天要分享的——線程中斷。

下面的這斷代碼大家應(yīng)該再熟悉不過了,線程休眠需要捕獲或者拋出線程中斷異常,也就是你在睡覺的時(shí)候突然有個(gè)人沖進(jìn)來把你吵醒了。

try {Thread.sleep(3000); } catch (InterruptedException e) {e.printStackTrace(); }

此時(shí)線程被打斷后,代碼會(huì)繼續(xù)運(yùn)行或者拋出異常結(jié)束運(yùn)行,這并不是我們需要的中斷線程的作用。

到底是什么是線程中斷?

線程中斷即線程運(yùn)行過程中被其他線程給打斷了,它與 stop 最大的區(qū)別是:stop 是由系統(tǒng)強(qiáng)制終止線程,而線程中斷則是給目標(biāo)線程發(fā)送一個(gè)中斷信號,如果目標(biāo)線程沒有接收線程中斷的信號并結(jié)束線程,線程則不會(huì)終止,具體是否退出或者執(zhí)行其他邏輯由目標(biāo)線程決定。

我們來看下線程中斷最重要的 3 個(gè)方法,它們都是來自 Thread 類!

1、java.lang.Thread#interrupt

中斷目標(biāo)線程,給目標(biāo)線程發(fā)一個(gè)中斷信號,線程被打上中斷標(biāo)記。

2、java.lang.Thread#isInterrupted()

判斷目標(biāo)線程是否被中斷,不會(huì)清除中斷標(biāo)記。

3、java.lang.Thread#interrupted

判斷目標(biāo)線程是否被中斷,會(huì)清除中斷標(biāo)記。

線程中斷實(shí)戰(zhàn)

我們來實(shí)例演示下線程中斷如何用!

示例1(中斷失敗)

/*** 來源:Java技術(shù)棧*/ private static void test1() {Thread thread = new Thread(() -> {while (true) {Thread.yield();}});thread.start();thread.interrupt(); }

請問示例1中的線程會(huì)被中斷嗎?答案:不會(huì),因?yàn)殡m然給線程發(fā)出了中斷信號,但程序中并沒有響應(yīng)中斷信號的邏輯,所以程序不會(huì)有任何反應(yīng)。

示例2:(中斷成功)

/*** 來源:Java技術(shù)棧*/ private static void test2() {Thread thread = new Thread(() -> {while (true) {Thread.yield();// 響應(yīng)中斷if (Thread.currentThread().isInterrupted()) {System.out.println("Java技術(shù)棧線程被中斷,程序退出。");return;}}});thread.start();thread.interrupt(); }

我們給示例2加上了響應(yīng)中斷的邏輯,程序接收到中斷信號打印出信息后返回退出。

示例3(中斷失敗)

/*** 來源:Java技術(shù)棧*/ private static void test3() throws InterruptedException {Thread thread = new Thread(() -> {while (true) {// 響應(yīng)中斷if (Thread.currentThread().isInterrupted()) {System.out.println("Java技術(shù)棧線程被中斷,程序退出。");return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("Java技術(shù)棧線程休眠被中斷,程序退出。");}}});thread.start();Thread.sleep(2000);thread.interrupt(); }

示例3 sleep() 方法被中斷,并輸出了 Java技術(shù)棧線程休眠被中斷,程序退出。 程序繼續(xù)運(yùn)行……為什么呢?

來看 sleep 的源碼:

可以看出 sleep() 方法被中斷后會(huì)清除中斷標(biāo)記,所以循環(huán)會(huì)繼續(xù)運(yùn)行。。

示例4(中斷成功)

/*** :Java技術(shù)棧*/ private static void test4() throws InterruptedException {Thread thread = new Thread(() -> {while (true) {// 響應(yīng)中斷if (Thread.currentThread().isInterrupted()) {System.out.println("Java技術(shù)棧線程被中斷,程序退出。");return;}try {Thread.sleep(3000);} catch (InterruptedException e) {System.out.println("Java技術(shù)棧線程休眠被中斷,程序退出。");Thread.currentThread().interrupt();}}});thread.start();Thread.sleep(2000);thread.interrupt(); }

示例4全部信息輸出并正常退出,只是在 sleep() 方法被中斷并清除標(biāo)記后手動(dòng)重新中斷當(dāng)前線程,然后程序接收中斷信號返回退出。

通過以上 4 個(gè)中斷示例,相信對 Java 線程中斷的概念有了全面的了解。更多 Java 多線程技術(shù)文章請關(guān)注Java技術(shù)棧。

版權(quán)申明:本文系 "Java技術(shù)棧" 原創(chuàng),原創(chuàng)實(shí)屬不易,轉(zhuǎn)載、引用本文內(nèi)容請注明出處,禁止抄襲、洗稿,請自重,尊重他人勞動(dòng)成果和知識產(chǎn)權(quán)。

總結(jié)

以上是生活随笔為你收集整理的java sleep方法_一文搞懂 Java 线程中断!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。