摘要:我們通常使用中斷去終止線程如何中斷線程調(diào)用,向線程發(fā)送指示。當(dāng)獲取到指示時,這些方法將拋出異常。捕獲這個異常,并即可中斷線程。
Interrupt ?
An interrupt is an indication to a thread that it should stop what it is doing and do something else.
中斷(interupt)是一個指示,指示一個線程停止正在做的事情,并做一些其他的事情。
我們通常使用 中斷 去終止線程
如何中斷線程 ?調(diào)用 interrupt(),向線程發(fā)送 interrupt 指示。
如果一個線程內(nèi),頻繁的調(diào)用一個可以 throw InterruptedException 的方法,在接收到 interrupt 指示時,拋出 InterruptedException 。只需要 catch 該異常,并 return,即可退出 run 方法 —— 即終止了線程。
for (int i = 0; i < importantInfo.length; i++) { // Pause for 4 seconds try { Thread.sleep(4000); } catch (InterruptedException e) { // We"ve been interrupted: no more messages. return; } // Print a message System.out.println(importantInfo[i]); }
Thread 的很多方法都可以 throw InterruptedException,比如 Thread.sleep 方法。當(dāng)獲取到 interrupt 指示時,這些方法將拋出異常。捕獲這個異常,并 return ,即可中斷線程。
如果一個線程會運行很長時間,且沒有調(diào)用任何可以 throw InterruptedException 的方法,怎么辦?必須定期運行 Thread.interrupted 方法,當(dāng)獲取 interrupt 指令時返回 true
for (int i = 0; i < inputs.length; i++) { heavyCrunch(inputs[i]); if (Thread.interrupted()) { // We"ve been interrupted: no more crunching. return; } }
如果項目比較復(fù)雜的話,throw new InterruptedException 更有意義
if (Thread.interrupted()) { throw new InterruptedException(); }中斷狀態(tài)標(biāo)志 - The Interrupt Status Flag
The interrupt mechanism is implemented using an internal flag known as the interrupt status. Invoking Thread.interrupt sets this flag. When a thread checks for an interrupt by invoking the static method Thread.interrupted, interrupt status is cleared. The non-static isInterrupted method, which is used by one thread to query the interrupt status of another, does not change the interrupt status flag.
interrupt 機制的實現(xiàn),使用了一個內(nèi)部的flag,用于標(biāo)識 interrupt status 。
調(diào)用 靜態(tài)方法 Thread.interrupted(用于檢查當(dāng)前 Thread 是否 interrupt),interrupt status 會被清除。
調(diào)用 非靜態(tài)方法 isInterrupted(用于一個 Thread 查詢另一個 Thread 是否 interrupt),不會清除 interrupt status。
Interrupts
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65196.html
摘要:現(xiàn)在終止一個線程,基本上只能靠曲線救國式的中斷來實現(xiàn)。中斷機制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設(shè)置一個中斷狀態(tài)清除一個中斷狀態(tài)方法同時會返回線程原來的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務(wù)的執(zhí)行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
摘要:從而可以啟動和取消異步計算任務(wù)查詢異步計算任務(wù)是否完成和獲取異步計算任務(wù)的返回結(jié)果。原理分析在分析中我們沒有看它的父類,其中有一個方法,返回一個,說明該方法可以獲取異步任務(wù)的返回結(jié)果。 FutureTask介紹 FutureTask是一種可取消的異步計算任務(wù)。它實現(xiàn)了Future接口,代表了異步任務(wù)的返回結(jié)果。從而FutureTask可以啟動和取消異步計算任務(wù)、查詢異步計算任務(wù)是否完成...
摘要:這是多處理器系統(tǒng)中,調(diào)度器用來分散任務(wù)到不同的機制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細(xì)介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調(diào)優(yōu)思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經(jīng)驗, 那肯定就更好了 業(yè)務(wù)背景 框架及相應(yīng)環(huán)境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...
摘要:這是多處理器系統(tǒng)中,調(diào)度器用來分散任務(wù)到不同的機制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細(xì)介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調(diào)優(yōu)思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經(jīng)驗, 那肯定就更好了 業(yè)務(wù)背景 框架及相應(yīng)環(huán)境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...
閱讀 3311·2021-09-30 09:54
閱讀 3808·2021-09-22 15:01
閱讀 3116·2021-08-27 16:19
閱讀 2580·2019-08-29 18:39
閱讀 2168·2019-08-29 14:09
閱讀 638·2019-08-26 10:23
閱讀 1346·2019-08-23 12:01
閱讀 1876·2019-08-22 13:57