基于JDK8總結(jié)java中的interrupt
1. interrupt知識點
以下總結(jié)基于JDK8
本文不會完整說明interrupt,只會羅列一些比較重要的點。完整了解Thread.interrupt可以看參考資料。
以下的一些理解新的有助于理解參考資料的文章:
interrupt方法調(diào)用后,針對BLOCKED狀態(tài)的線程,只是設(shè)定中斷標志位為true。是否響應(yīng)中斷(感知這個標志位的變化)取決于API的設(shè)計。JDK的阻塞IO API、Synchronized同步塊、還有Lock中的很多方法(不包括lockInterruptibly)都是不響應(yīng)中斷的。當然調(diào)用線程可以利用標志位判斷來使得自己設(shè)計的API是可響應(yīng)中斷的。
interrupt方法調(diào)用后,針對WAITING/TIMED_WAITING狀態(tài)的線程,會上拋interruptedException**并且設(shè)置中斷標志位false**。例如線程調(diào)用Thread.sleep,Object.wait()之后。
如果線程尚未啟動(NEW),或者已經(jīng)結(jié)束(TERMINATED),則調(diào)用interrupt()對它沒有任何效果,中斷標志位也不會被設(shè)置。
最佳實踐:有時候一些方法設(shè)計上不允許被中斷或者取消,但是當別的線程發(fā)來中斷請求的時候,也需要進行標記的保留,方便其他調(diào)用方“了解情況”
public Task getNextTask(BlockingQueue<Task> queue) {
boolean interrupted = false;
try {
while (true) {
try {
return queue.take();
} catch (InterruptedException e) {
//fianlly中依賴的狀態(tài)標記
interrupted = true;
// fall through and retry
}
}
} finally {
if (interrupted)
//在fianlly中重新標記,確保沒有丟失中斷通知
Thread.currentThread().interrupt();
}
}
利用中斷可以實現(xiàn)一些cancel的操作。例如:
package concurrent;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* Created by wanshao
* Date: 2017/12/18
* Time: 下午3:42
**/
public class InterruptExample {
public static void main(String[] args) throws InterruptedException {
InterruptTask interruptTask = new InterruptTask();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(interruptTask);
Thread.sleep(100);
interruptTask.cancel();
executorService.shutdown();
}
}
/**
* 一個響應(yīng)中斷的任務(wù)
*/
class InterruptTask implements Callable<Integer> {
private BlockingQueue<Task> queue;
//保存要被interrupt的線程
Thread t;
@Override
public Integer call() throws InterruptedException {
System.out.println("start a blocked task");
try {
t = Thread.currentThread();
Thread.currentThread().sleep(50000);
} catch (InterruptedException e) {
System.out.println("be interrupted");
e.printStackTrace();
}
return 0;
}
public void cancel() {
System.out.println("cacel a task....");
//這里直接調(diào)用Thread.currentThread()會獲取到main線程,而不是線程池里面的線程
if (!t.isInterrupted()) {
t.interrupt();
}
}
}
總結(jié)
以上所述是小編給大家介紹的基于JDK8總結(jié)java中的interrupt,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
springboot中配置好登錄攔截后,swagger訪問不了問題
這篇文章主要介紹了springboot中配置好登錄攔截后,swagger訪問不了問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Spring Boot整合elasticsearch的詳細步驟
這篇文章主要介紹了Spring Boot整合elasticsearch的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
詳解Servlet3.0新特性(從注解配置到websocket編程)
Servlet3.0的出現(xiàn)是servlet史上最大的變革,其中的許多新特性大大的簡化了web應(yīng)用的開發(fā),為廣大勞苦的程序員減輕了壓力,提高了web開發(fā)的效率。2017-04-04
Java countDownLatch如何實現(xiàn)多線程任務(wù)阻塞等待
這篇文章主要介紹了Java countDownLatch如何實現(xiàn)多線程任務(wù)阻塞等待,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
SpringBoot如何讀取xml配置bean(@ImportResource)
這篇文章主要介紹了SpringBoot如何讀取xml配置bean(@ImportResource),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01
淺談springboot多模塊(modules)開發(fā)
這篇文章主要介紹了淺談springboot多模塊(modules)開發(fā),詳細的介紹了springboot多模塊的實現(xiàn),有興趣的可以了解一下2017-09-09

