摘要:我們通常使用中斷去終止線程如何中斷線程調用,向線程發送指示。當獲取到指示時,這些方法將拋出異常。捕獲這個異常,并即可中斷線程。
Interrupt ?
An interrupt is an indication to a thread that it should stop what it is doing and do something else.
中斷(interupt)是一個指示,指示一個線程停止正在做的事情,并做一些其他的事情。
我們通常使用 中斷 去終止線程
如何中斷線程 ?調用 interrupt(),向線程發送 interrupt 指示。
如果一個線程內,頻繁的調用一個可以 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 方法。當獲取到 interrupt 指示時,這些方法將拋出異常。捕獲這個異常,并 return ,即可中斷線程。
如果一個線程會運行很長時間,且沒有調用任何可以 throw InterruptedException 的方法,怎么辦?必須定期運行 Thread.interrupted 方法,當獲取 interrupt 指令時返回 true
for (int i = 0; i < inputs.length; i++) { heavyCrunch(inputs[i]); if (Thread.interrupted()) { // We"ve been interrupted: no more crunching. return; } }
如果項目比較復雜的話,throw new InterruptedException 更有意義
if (Thread.interrupted()) { throw new InterruptedException(); }中斷狀態標志 - 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 機制的實現,使用了一個內部的flag,用于標識 interrupt status 。
調用 靜態方法 Thread.interrupted(用于檢查當前 Thread 是否 interrupt),interrupt status 會被清除。
調用 非靜態方法 isInterrupted(用于一個 Thread 查詢另一個 Thread 是否 interrupt),不會清除 interrupt status。
Interrupts
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65196.html
摘要:現在終止一個線程,基本上只能靠曲線救國式的中斷來實現。中斷機制的核心在于中斷狀態和異常中斷狀態設置一個中斷狀態清除一個中斷狀態方法同時會返回線程原來的中斷的狀態。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...
摘要:從而可以啟動和取消異步計算任務查詢異步計算任務是否完成和獲取異步計算任務的返回結果。原理分析在分析中我們沒有看它的父類,其中有一個方法,返回一個,說明該方法可以獲取異步任務的返回結果。 FutureTask介紹 FutureTask是一種可取消的異步計算任務。它實現了Future接口,代表了異步任務的返回結果。從而FutureTask可以啟動和取消異步計算任務、查詢異步計算任務是否完成...
摘要:這是多處理器系統中,調度器用來分散任務到不同的機制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調優思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經驗, 那肯定就更好了 業務背景 框架及相應環境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...
摘要:這是多處理器系統中,調度器用來分散任務到不同的機制,通常也被稱為處理器間中斷,。文章編寫計劃 待完成: 詳細介紹用到的各個工具 作者: 萬千鈞(祝星) 適合閱讀人群 文中的調優思路無論是php, java, 還是其他任何語言都是用. 如果你有php使用經驗, 那肯定就更好了 業務背景 框架及相應環境 laravel5.7, mysql5.7, redis5, nginx1.15 cento...
閱讀 3300·2021-09-30 09:54
閱讀 3782·2021-09-22 15:01
閱讀 3105·2021-08-27 16:19
閱讀 2572·2019-08-29 18:39
閱讀 2146·2019-08-29 14:09
閱讀 623·2019-08-26 10:23
閱讀 1337·2019-08-23 12:01
閱讀 1862·2019-08-22 13:57