女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用interrupt停止線(xiàn)程

Android編程精選 ? 來(lái)源:CSDN ? 作者:CSDN ? 2022-05-04 17:18 ? 次閱讀
啟動(dòng)線(xiàn)程需要調(diào)用 Thread 類(lèi)的 start() 方法,并在 run() 方法中定義需要執(zhí)行的任務(wù)。啟動(dòng)一個(gè)線(xiàn)程非常簡(jiǎn)單,但如果想要正確停止它就沒(méi)那么容易了。

為什么不強(qiáng)制停止

對(duì)于 Java 而言,最正確的停止線(xiàn)程的方式是使用 interrupt。但 interrupt僅僅起到通知被停止線(xiàn)程的作用。而對(duì)于被停止的線(xiàn)程而言,它擁有完全的自主權(quán),它既可以選擇立即停止,也可以選擇一段時(shí)間后停止,也可以選擇壓根不停止。

為什么 Java 不提供強(qiáng)制停止線(xiàn)程的能力呢?

事實(shí)上,Java 希望程序間能夠相互通知、相互協(xié)作地管理線(xiàn)程,因?yàn)槿绻涣私鈱?duì)方正在做的工作,貿(mào)然強(qiáng)制停止線(xiàn)程就可能會(huì)造成一些安全的問(wèn)題。

比如:

線(xiàn)程正在寫(xiě)入一個(gè)文件,這時(shí)收到終止信號(hào),它就需要根據(jù)自身業(yè)務(wù)判斷,是選擇立即停止,還是將整個(gè)文件寫(xiě)入成功后停止。如果選擇立即停止就可能造成數(shù)據(jù)不完整,不管是中斷命令發(fā)起者,還是接收者都不希望數(shù)據(jù)出現(xiàn)問(wèn)題。

如何用 interrupt 停止線(xiàn)程

while(!Thread.currentThread().isInterrupted()
&&moreworktodo){
domorework
}

我們一旦調(diào)用某個(gè)線(xiàn)程的 interrupt() 之后,這個(gè)線(xiàn)程的中斷標(biāo)記位就會(huì)被設(shè)置成 true。每個(gè)線(xiàn)程都有這樣的標(biāo)記位,當(dāng)線(xiàn)程執(zhí)行時(shí),應(yīng)該定期檢查這個(gè)標(biāo)記位,如果標(biāo)記位被設(shè)置成 true,就說(shuō)明有程序想終止該線(xiàn)程。

回到源碼,可以看到在 while 循環(huán)體判斷語(yǔ)句中,首先通過(guò) Thread.currentThread().isInterrupt() 判斷線(xiàn)程是否被中斷,隨后檢查是否還有工作要做。&& 邏輯表示只有當(dāng)兩個(gè)判斷條件同時(shí)滿(mǎn)足的情況下,才會(huì)去執(zhí)行下面的工作。

來(lái)段代碼瞅瞅。

publicclassStopThreadimplementsRunnable{

@Override
publicvoidrun(){
intcount=0;
while(!Thread.currentThread().isInterrupted()&&count1000){
System.out.println("count="+count++);
}
}

publicstaticvoidmain(String[]args)throwsInterruptedException{
Threadthread=newThread(newStopThread());
thread.start();
Thread.sleep(5);
thread.interrupt();
}
}

在 StopThread 類(lèi)的 run() 方法中,首先判斷線(xiàn)程是否被中斷,然后判斷 count 值是否小于 1000。

這個(gè)線(xiàn)程的工作內(nèi)容很簡(jiǎn)單,就是打印 0~999 的數(shù)字,每打印一個(gè)數(shù)字 count 值加 1,可以看到,線(xiàn)程會(huì)在每次循環(huán)開(kāi)始之前,檢查是否被中斷了。接下來(lái)在 main 函數(shù)中會(huì)啟動(dòng)該線(xiàn)程,然后休眠 5 毫秒后立刻中斷線(xiàn)程,該線(xiàn)程會(huì)檢測(cè)到中斷信號(hào),于是在還沒(méi)打印完1000個(gè)數(shù)的時(shí)候就會(huì)停下來(lái),這種就屬于通過(guò) interrupt 正確停止線(xiàn)程的情況。

sleep 期間能否感受到中斷

先說(shuō)結(jié)論,可以。

publicclassStopDuringSleep{

publicstaticvoidmain(String[]args)throwsInterruptedException{
Runnablerunnable=()->{
intnum=0;
try{
while(!Thread.currentThread().isInterrupted()&&num<=?1000){
System.out.println(num);
num++;
Thread.sleep(1000000);
}
}catch(InterruptedExceptione){
e.printStackTrace();
}
};
Threadthread=newThread(runnable);
thread.start();
Thread.sleep(5);
thread.interrupt();
}
}

運(yùn)行后的結(jié)果你猜這么著,程序會(huì)拋出異常

ec708e1c-c3c3-11ec-bce3-dac502259ad0.png

如果 sleep、wait 等可以讓線(xiàn)程進(jìn)入阻塞的方法使線(xiàn)程休眠了,而處于休眠中的線(xiàn)程被中斷,那么線(xiàn)程是可以感受到中斷信號(hào)的,并且會(huì)拋出一個(gè) InterruptedException 異常,同時(shí)清除中斷信號(hào),將中斷標(biāo)記位設(shè)置成 false。這樣一來(lái)就不用擔(dān)心長(zhǎng)時(shí)間休眠中線(xiàn)程感受不到中斷了,因?yàn)榧幢憔€(xiàn)程還在休眠,仍然能夠響應(yīng)中斷通知,并拋出異常。

但是這樣只能相應(yīng)一次中斷信號(hào)了,怎么辦?

合理利用好 try/catch

我們?cè)趯?shí)際開(kāi)發(fā)中不能盲目吞掉中斷,如果不在方法簽名中聲明,也不在 catch 語(yǔ)句塊中再次恢復(fù)中斷,而是在 catch 中不作處理,我們稱(chēng)這種行為是“屏蔽了中斷請(qǐng)求”。如果我們盲目地屏蔽了中斷請(qǐng)求,會(huì)導(dǎo)致中斷信號(hào)被完全忽略,最終導(dǎo)致線(xiàn)程無(wú)法正確停止。

try{
Thread.sleep(2000);
}catch(InterruptedExceptione){
//此處處理中斷異常請(qǐng)求
}

停止線(xiàn)程的方式有幾種

  • void shutdown;
  • boolean isShutdown;
  • boolean isTerminated;
  • boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;
  • List shutdownNow;

下面我們就對(duì)這些方法逐一展開(kāi)。

shutdown()

調(diào)用 shutdown() 方法之后線(xiàn)程池并不是立刻就被關(guān)閉,因?yàn)檫@時(shí)線(xiàn)程池中可能還有很多任務(wù)正在被執(zhí)行,或是任務(wù)隊(duì)列中有大量正在等待被執(zhí)行的任務(wù),調(diào)用 shutdown() 方法后線(xiàn)程池會(huì)在執(zhí)行完正在執(zhí)行的任務(wù)和隊(duì)列中等待的任務(wù)后才徹底關(guān)閉。

但這并不代表 shutdown() 操作是沒(méi)有任何效果的,調(diào)用 shutdown() 方法后如果還有新的任務(wù)被提交,線(xiàn)程池則會(huì)根據(jù)拒絕策略直接拒絕后續(xù)新提交的任務(wù)。

isShutdown()

它可以返回 true 或者 false 來(lái)判斷線(xiàn)程池是否已經(jīng)開(kāi)始了關(guān)閉工作,也就是是否執(zhí)行了 shutdown 或者 shutdownNow 方法。這里需要注意,如果調(diào)用 isShutdown() 方法的返回的結(jié)果為 true 并不代表線(xiàn)程池此時(shí)已經(jīng)徹底關(guān)閉了,這僅僅代表線(xiàn)程池開(kāi)始了關(guān)閉的流程,也就是說(shuō),此時(shí)可能線(xiàn)程池中依然有線(xiàn)程在執(zhí)行任務(wù),隊(duì)列里也可能有等待被執(zhí)行的任務(wù)。

isTerminated()

這個(gè)方法可以檢測(cè)線(xiàn)程池是否真正“終結(jié)”了,這不僅代表線(xiàn)程池已關(guān)閉,同時(shí)代表線(xiàn)程池中的所有任務(wù)都已經(jīng)都執(zhí)行完畢了,因?yàn)槲覀儎偛耪f(shuō)過(guò),調(diào)用 shutdown 方法之后,線(xiàn)程池會(huì)繼續(xù)執(zhí)行里面未完成的任務(wù),不僅包括線(xiàn)程正在執(zhí)行的任務(wù),還包括正在任務(wù)隊(duì)列中等待的任務(wù)。

比如此時(shí)已經(jīng)調(diào)用了 shutdown 方法,但是有一個(gè)線(xiàn)程依然在執(zhí)行任務(wù),那么此時(shí)調(diào)用 isShutdown 方法返回的是 true ,而調(diào)用 isTerminated 方法返回的便是 false ,因?yàn)榫€(xiàn)程池中還有任務(wù)正在在被執(zhí)行,線(xiàn)程池并沒(méi)有真正“終結(jié)”。直到所有任務(wù)都執(zhí)行完畢了,調(diào)用 isTerminated() 方法才會(huì)返回 true,這表示線(xiàn)程池已關(guān)閉并且線(xiàn)程池內(nèi)部是空的,所有剩余的任務(wù)都執(zhí)行完畢了。

awaitTermination()

第四個(gè)方法叫作 awaitTermination(),它本身并不是用來(lái)關(guān)閉線(xiàn)程池的,而是主要用來(lái)判斷線(xiàn)程池狀態(tài)的。比如我們給 awaitTermination 方法傳入的參數(shù)是 10 秒,那么它就會(huì)陷入 10 秒鐘的等待,直到發(fā)生以下三種情況之一:

  • 等待期間(包括進(jìn)入等待狀態(tài)之前)線(xiàn)程池已關(guān)閉并目所有已提交的任務(wù)(包括正在執(zhí)行的和隊(duì)列中等待的都執(zhí)行完畢,相當(dāng)于線(xiàn)程池已經(jīng)“終結(jié)”了,方法便會(huì)返回true
  • 等待超時(shí)時(shí)間到后,第一種線(xiàn)程池“終結(jié)”的情況始終未發(fā)生,方法返回 false
  • 等待期間線(xiàn)程被中斷,方法會(huì)拋出 Interruptedexception異常

等待期間(包括進(jìn)入等待狀態(tài)之前)線(xiàn)程池已關(guān)閉并且所有已提交的任務(wù)(包括正在執(zhí)行的和隊(duì)列中等待的)都執(zhí)行完畢,相當(dāng)于線(xiàn)程池已經(jīng)“終結(jié)”了,方法便會(huì)返回 true;

等待超時(shí)時(shí)間到后,第一種線(xiàn)程池“終結(jié)”的情況始終未發(fā)生,方法返回 false;等待期間線(xiàn)程被中斷,方法會(huì)拋出 InterruptedException 異常。

shutdownNow()

最后一個(gè)方法是 shutdownNow(),也是 5 種方法里功能最強(qiáng)大的,它與第一種 shutdown 方法不同之處在于名字中多了一個(gè)單詞 Now,也就是表示立刻關(guān)閉的意思。參考這里:shutdown 和 shutdownNow 的區(qū)別

在執(zhí)行 shutdownNow 方法之后,首先會(huì)給所有線(xiàn)程池中的線(xiàn)程發(fā)送 interrupt 中斷信號(hào),嘗試中斷這些任務(wù)的執(zhí)行,然后會(huì)將任務(wù)隊(duì)列中正在等待的所有任務(wù)轉(zhuǎn)移到一個(gè) List 中并返回,我們可以根據(jù)返回的任務(wù) List 來(lái)進(jìn)行一些補(bǔ)救的操作,例如記錄在案并在后期重試。

publicListshutdownNow(){
Listtasks;
finalReentrantLockmainLock=this.mainLock;
mainLock.lock();

try{
checkShutdownAccess();
advanceRunState(STOP);
interruptWorkers();
tasks=drainQueue();
}finally{
mainLock.unlock();
}

tryTerminate();
returntasks;
}

源碼中有一行 interruptWorkers() 代碼,這行代碼會(huì)讓每一個(gè)已經(jīng)啟動(dòng)的線(xiàn)程都中斷,這樣線(xiàn)程就可以在執(zhí)行任務(wù)期間檢測(cè)到中斷信號(hào)并進(jìn)行相應(yīng)的處理,提前結(jié)束任務(wù)。

這里需要注意的是,由于 Java 中不推薦強(qiáng)行停止線(xiàn)程的機(jī)制的限制,即便我們調(diào)用了 shutdownNow 方法,如果被中斷的線(xiàn)程對(duì)于中斷信號(hào)不理不睬,那么依然有可能導(dǎo)致任務(wù)不會(huì)停止。

總結(jié)

中斷和關(guān)閉線(xiàn)程的方式五花八門(mén),看起來(lái)很相似,其實(shí)里頭大有門(mén)道。處理不好,可是會(huì)導(dǎo)致程序崩潰的。

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2984

    瀏覽量

    106845
  • 線(xiàn)程
    +關(guān)注

    關(guān)注

    0

    文章

    507

    瀏覽量

    20071

原文標(biāo)題:如何正確的停掉線(xiàn)程?這里面大有門(mén)道!

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    AN-737: 如何用ADIsimADC完成ADC建模

    電子發(fā)燒友網(wǎng)站提供《AN-737: 如何用ADIsimADC完成ADC建模.pdf》資料免費(fèi)下載
    發(fā)表于 01-13 14:54 ?0次下載
    AN-737: 如<b class='flag-5'>何用</b>ADIsimADC完成ADC建模

    socket 多線(xiàn)程編程實(shí)現(xiàn)方法

    在現(xiàn)代網(wǎng)絡(luò)編程中,多線(xiàn)程技術(shù)被廣泛應(yīng)用于提高服務(wù)器的并發(fā)處理能力。Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),而將多線(xiàn)程技術(shù)應(yīng)用于Socket編程,可以顯著提升服務(wù)器的性能。 多線(xiàn)程編程的基本概念 多線(xiàn)
    的頭像 發(fā)表于 11-12 14:16 ?880次閱讀

    摩爾線(xiàn)程完成股改,籌備上市

    近日,摩爾線(xiàn)程智能科技(北京)股份有限公司(簡(jiǎn)稱(chēng)“摩爾線(xiàn)程”)宣布已完成股改,并正積極籌備上市。據(jù)國(guó)家企業(yè)信用信息公示系統(tǒng)最新查詢(xún)結(jié)果顯示,摩爾線(xiàn)程的市場(chǎng)主體類(lèi)型在10月28日已從其他有限責(zé)任公司
    的頭像 發(fā)表于 11-12 14:15 ?1017次閱讀

    Python中多線(xiàn)程和多進(jìn)程的區(qū)別

    Python作為一種高級(jí)編程語(yǔ)言,提供了多種并發(fā)編程的方式,其中多線(xiàn)程與多進(jìn)程是最常見(jiàn)的兩種方式之一。在本文中,我們將探討Python中多線(xiàn)程與多進(jìn)程的概念、區(qū)別以及如何使用線(xiàn)程池與進(jìn)程池來(lái)提高并發(fā)執(zhí)行效率。
    的頭像 發(fā)表于 10-23 11:48 ?905次閱讀
    Python中多<b class='flag-5'>線(xiàn)程</b>和多進(jìn)程的區(qū)別

    何用PMBus解碼UCD90xxx故障日志

    電子發(fā)燒友網(wǎng)站提供《如何用PMBus解碼UCD90xxx故障日志.pdf》資料免費(fèi)下載
    發(fā)表于 09-25 10:04 ?0次下載
    如<b class='flag-5'>何用</b>PMBus解碼UCD90xxx故障日志

    CPU線(xiàn)程和程序線(xiàn)程的區(qū)別

    CPU的線(xiàn)程與程序的線(xiàn)程在概念、作用、實(shí)現(xiàn)方式以及性能影響等方面存在顯著差異。以下是對(duì)兩者區(qū)別的詳細(xì)闡述,旨在深入探討這一技術(shù)話(huà)題。
    的頭像 發(fā)表于 09-02 11:18 ?1912次閱讀

    PWM技術(shù)如何實(shí)現(xiàn)電機(jī)的平滑啟動(dòng)和停止

    PWM(脈沖寬度調(diào)制)技術(shù)在電機(jī)控制中實(shí)現(xiàn)平滑啟動(dòng)和停止的功能,主要通過(guò)精確調(diào)節(jié)電機(jī)輸入電壓或電流的波形來(lái)實(shí)現(xiàn)。這種技術(shù)能夠顯著減少電機(jī)在啟動(dòng)和停止過(guò)程中的機(jī)械沖擊和振動(dòng),從而延長(zhǎng)電機(jī)壽命并提高系統(tǒng)的穩(wěn)定性。以下將詳細(xì)闡述PWM技術(shù)如何實(shí)現(xiàn)電機(jī)的平滑啟動(dòng)和
    的頭像 發(fā)表于 08-12 17:53 ?3620次閱讀

    一文掌握Python多線(xiàn)程

    使用線(xiàn)程可以把占據(jù)長(zhǎng)時(shí)間的程序中的任務(wù)放到后臺(tái)去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1177次閱讀

    三菱異常停止plc怎么解決

    三菱電機(jī)(Mitsubishi Electric)是一家知名的日本企業(yè),其生產(chǎn)的PLC(可編程邏輯控制器)廣泛應(yīng)用于工業(yè)自動(dòng)化領(lǐng)域。然而,在使用過(guò)程中,PLC可能會(huì)出現(xiàn)異常停止的情況。 一、三菱
    的頭像 發(fā)表于 07-25 10:13 ?3507次閱讀

    鴻蒙開(kāi)發(fā):線(xiàn)程模型

    FA模型下的線(xiàn)程主要有如下三類(lèi)
    的頭像 發(fā)表于 06-24 17:27 ?641次閱讀
    鴻蒙開(kāi)發(fā):<b class='flag-5'>線(xiàn)程</b>模型

    探索虛擬線(xiàn)程:原理與實(shí)現(xiàn)

    虛擬線(xiàn)程的引入與優(yōu)勢(shì) 在Loom項(xiàng)目之前,Java虛擬機(jī)(JVM)中的線(xiàn)程是通過(guò)java.lang.Thread類(lèi)型來(lái)實(shí)現(xiàn)的,這些線(xiàn)程被稱(chēng)為平臺(tái)線(xiàn)程。 然而,平臺(tái)
    的頭像 發(fā)表于 06-24 11:35 ?519次閱讀
    探索虛擬<b class='flag-5'>線(xiàn)程</b>:原理與實(shí)現(xiàn)

    鴻蒙開(kāi)發(fā):停止PageAbility

    停止PageAbility通過(guò)featureAbility中的terminateSelf接口實(shí)現(xiàn)。
    的頭像 發(fā)表于 06-18 14:16 ?479次閱讀
    鴻蒙開(kāi)發(fā):<b class='flag-5'>停止</b>PageAbility

    摩爾線(xiàn)程與智譜AI完成大模型性能測(cè)試與適配

    近日,摩爾線(xiàn)程與智譜AI在人工智能領(lǐng)域開(kāi)展了一輪深入的合作,共同對(duì)GPU大模型進(jìn)行了適配及性能測(cè)試。此次測(cè)試不僅涵蓋了大模型的推理能力,還涉及了基于摩爾線(xiàn)程夸娥(KUAE)千卡智算集群的大模型預(yù)訓(xùn)練,旨在全面評(píng)估摩爾線(xiàn)程GPU在
    的頭像 發(fā)表于 06-14 16:40 ?1409次閱讀

    鴻蒙開(kāi)發(fā):【線(xiàn)程模型】

    管理其他線(xiàn)程的ArkTS引擎實(shí)例,例如使用TaskPool(任務(wù)池)創(chuàng)建任務(wù)或取消任務(wù)、啟動(dòng)和終止Worker線(xiàn)程
    的頭像 發(fā)表于 06-13 16:38 ?656次閱讀
    鴻蒙開(kāi)發(fā):【<b class='flag-5'>線(xiàn)程</b>模型】

    動(dòng)態(tài)線(xiàn)程池思想學(xué)習(xí)及實(shí)踐

    相關(guān)文檔 美團(tuán)線(xiàn)程池實(shí)踐:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 線(xiàn)程池思想解析:https
    的頭像 發(fā)表于 06-13 15:43 ?1469次閱讀
    動(dòng)態(tài)<b class='flag-5'>線(xiàn)程</b>池思想學(xué)習(xí)及實(shí)踐