Java中,ThreadGroup的interrupt方法源碼,難道你還不知道嗎?

2021-01-07 編程小課堂

interupt一個thread group會導致該group中所有的active線程都被interrupt,也就是說該group中每一個線程的interrupt標識都被設置了,下面是ThreadGroup的interrupt方法的源碼:

public final void interrupt(){

int ngroupsSnapshot;

ThreadGroup[]groupsSnapshot;

synchronized(this){

checkAccess();

for(inti=0;i<nthreads;i++){

threads[i].interrupt();

ngroupsSnapshot=ngroups;

if(groups!=null){

groupsSnapshot=Arrays.copyof(groups,ngroup)

} else{

groupsSnapshot=nul1;

}

for(inti=0;i< ngroupssnapshot;i++){

groupsSnapshot[i]. interrupt();

}

}

以上就是筆者整理的Java中,ThreadGroup的interrupt方法源碼了。分析上述源碼,我們可以看出在interupt內部會執行所有thread的interrupt方法,並且會遞歸獲取子group,然後執行它們各自的interrupt方法,group中的active thread都將被interrupt。

相關焦點

  • java多線程之Thread構造函數(源碼分析)
    官方文檔指出,當java虛擬機中沒有非守護線程了,默認線程也會退出。舉個例子就能明白:守護線程就像飯店裡面的服務員,非守護線程就像是顧客,顧客沒有了,那麼服務員也沒有存在的必要了。2、代碼演示我們通過代碼來演示一下他們的作用,在這裡主要有兩個線程一個是main線程,第二個就是自己創建的thread。
  • Java Thread類簡述
    因為下次恢復時需要知道在這之前當前線程已經執行到哪條指令了,所以需要記錄程序計數器的值,另外比如說線程正在進行某個計算的時候被掛起了,那麼下次繼續執行的時候需要知道之前掛起時變量的值時多少,因此需要記錄CPU寄存器的狀態。所以一般來說,線程上下文切換過程中會記錄程序計數器、CPU寄存器狀態等數據。
  • 學好Java很難?那是因為ThreadGroup的destroy用法,你還沒學會
    destroy用於銷毀ThreadGroup,該方法只是針對一個沒有任何active線程的group進行一次destroy標記,調用該方法的直接結果是在父group中將自己移除:>Destroys this thread group and all of its subgroups.
  • Java8線程池ThreadPoolExecutor底層原理及其源碼解析
    提交任務到線程池中的流程3.1 ThreadPoolExecutor#execute方法整體流程這裡以java.util.concurrent.ThreadPoolExecutor#execute方法為例, 畫一個簡單的圖:上圖中的worker可簡單理解為線程池中的一個線程, workers.size
  • Java編程中,interrupt的注意事項,看完你就明白了
    主要用來控制是否擦除線程interrupt的標識。isInterrupted方法的源碼中該參數為false,表示不想擦除:public boolean isInterrupted(){return isInterrupted(false);}如果一個線程在沒有執行可中斷方法之前就被打斷,那麼其接下來將執行可中斷方法,比如sleep會發生什麼樣的情況呢?
  • JNI-Thread中start方法調用與run方法回調分析
    started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } }}Start方法本身並不複雜,其核心是start0(),真正地將線程啟動起來。
  • Java:一個重要的停止線程方法——interrupt
    threadMap.put("nowThread",null);後來,由於擔心這個線程會卡死,導致後續正常調用該線程的操作無法進行,因此加了個手動停止線程運行的方法(interrupt):if(type == 3){ try{ Thread nowThread = threadMap.get
  • 你真的了解java的lambda嗎?- java lambda用法與源碼分析
    第一是接口允許有實現的方法。這種實現的方法是用default關鍵字來標記的(java反射中java.lang.reflect.Method#isDefault()方法用來判斷是否是default方法),例如:
  • 使用Executors,ThreadPoolExecutor,創建線程池,源碼分析理解
    如果你配置的拒絕策略是 AbortPolicy 的話,這個異常就會拋出來。第二當你設置的任務緩存隊列過小的時候,或者說, 你的線程池裡面所有的線程都在幹活(線程數== maxPoolSize),並且你的任務緩存隊列也已經充滿了等待的隊列, 這個時候,你再向它提交任務,則會拋出這個異常。
  • 正確使用 wait/notify/notify方法以及源碼解析
    看不了源碼,那只能看源碼的注釋,注釋太長,我摘取一些關鍵的點出來:1、Causes the current thread to wait until either another thread invokes the notify() method or the notifyAll
  • JAVA 線程池ThreadPoolExcutor原理探究
    內部類 Worker 分析上面分析過程中,提到了一個 Worker 類,對於某些對源碼不是很熟悉得同學可能有點不清楚,下面就來看看 Worker 的源碼:首先看到的是 Worker 繼承了(,說明它沒有在處理任務,這時可以對該線程進行中斷;線程池在執行 shutdown 方法或 tryTerminate 方法時會調用 interruptIdleWorkers 方法來中斷空閒的線程,interruptIdleWorkers 方法會使用 tryLock 方法來判斷線程池中的線程是否是空閒狀態;
  • 面試官:知道ThreadLocal嘛?談談你對它的理解?
    在java的多線程模塊中,ThreadLocal是經常被提問到的一個知識點,提問的方式有很多種,可能是循序漸進也可能是就像我的題目那樣,因此只有理解透徹了,不管怎麼問,都能遊刃有餘。這時候最好ThreadLocal,因為ThreadLocal在每個線程中對連接會創建一個副本,且在線程內部任何地方都可以使用,線程之間互不影響,這樣一來就不存在線程安全問題,也不會嚴重影響程序執行性能。是不是很好用。以上主要是講解了一個基本的案例,然後還分析了為什麼在資料庫連接的時候會使用ThreadLocal。
  • java面試系列--J2SE基礎(十二)
    wait是java.lang包的,屬於Object的方法,sleep是屬於Thread的方法;wait的時候,當前線程會釋放資源鎖,然後進入等待鎖定池,只有針對此對象調用notify方法後本線程才會繼續執行,sleep的時候,當前資源鎖並沒有釋放,直到sleep結束然後繼續執行;sleep的時候一般都要對異常進行處理,捕捉或外拋,而且sleep方法是一個靜態方法
  • Java Thread 那些事
    本文只聚焦JVM層面的線程模型,不考慮和真實的作業系統Thread模型掛鈎(由於篇幅有限,本文不會介紹Thread dump結構,也不會介紹調優過程中對工具的綜合使用,如ps,perf.top,iostat,jstack,TDA plugin,Thread inspector.如果有問題,歡迎大家留言交流)。
  • 你知道JDK中Condition到底是個什麼東西麼?
    不過在Condition中,是通過Condition.await(),Condition.signal+ReentrantLock來實現的。 所以,接下來,這一節你需要來學習一下Condition這個基礎組件。 首先還是通過一個例子簡單的熟悉下Condition的基本使用方法。
  • Java中線程池,你真的會用嗎?
    Executors 是一個Java中的工具類。提供工廠方法來創建不同類型的線程池。從上圖中也可以看出,Executors的創建線程池的方法,創建出來的線程池都實現了ExecutorService接口。常用方法有以下幾個:newFiexedThreadPool(int Threads):創建固定數目線程的線程池。
  • java中ThreadPoolExecutor常識匯總
    這篇文章主要介紹了java中ThreadPoolExecutor常識匯總,線程池技術在並發時經常會使用到,java中的線程池的使用是通過調用ThreadPoolExecutor來實現的。線程池技術在並發時經常會使用到,java中的線程池的使用是通過調用ThreadPoolExecutor來實現的。
  • Java並發編程之 Condition 源碼分析
    await() 方法源碼分析await() 源碼如下:        public final void await() throws InterruptedException {                    if (Thread.interrupted())                throw
  • Java是如何實現Future模式的?萬字詳解!
    為NEW且runner為null,說明還未有線程執行過異步任務,此時滿足執行異步任務的條件,// 此時同時調用CAS方法為成員變量runner設置當前線程的值;// 2)若任務狀態state為NEW且runner不為null,任務狀態雖為NEW但runner不為null,說明有線程正在執行異步任務,// 此時不滿足執行異步任務的條件
  • Java並發編程系列21|Condition-Lock的等待通知
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫我們知道 synchronized 鎖通過 Object 類的 wait()和 notify()方法實現線程間的等待通知機制,而比 synchronized 更靈活 Lock 鎖同樣也有實現等待通知機制的方式