欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入Java線程中斷的本質(zhì)與編程原則的概述

 更新時間:2013年05月04日 14:51:53   作者:  
本篇文章對Java線程中斷的本質(zhì)與編程原則進行了詳細的概述,需要的朋友參考下
在歷史上,Java試圖提供過搶占式限制中斷,但問題多多,例如前文介紹的已被廢棄的Thread.stop、Thread.suspend和 Thread.resume等。另一方面,出于Java應用代碼的健壯性的考慮,降低了編程門檻,減少不清楚底層機制的程序員無意破壞系統(tǒng)的概率。

    如今,Java的線程調(diào)度不提供搶占式中斷,而采用協(xié)作式的中斷。其實,協(xié)作式的中斷,原理很簡單,就是輪詢某個表示中斷的標記,我們在任何普通代碼的中都可以實現(xiàn)。

例如下面的代碼:
    volatile bool isInterrupted;
    //…
    while(!isInterrupted) {
        compute();
    }
    但是,上述的代碼問題也很明顯。當compute執(zhí)行時間比較長時,中斷無法及時被響應。另一方面,利用輪詢檢查標志變量的方式,想要中斷wait和sleep等線程阻塞操作也束手無策。

    如果仍然利用上面的思路,要想讓中斷及時被響應,必須在虛擬機底層進行線程調(diào)度的對標記變量進行檢查。是的,JVM中確實是這樣做的。

下面摘自java.lang.Thread的源代碼:

        public static boolean interrupted() {
            return currentThread().isInterrupted(true);
        }
       //…
        private native boolean isInterrupted(boolean ClearInterrupted);

可以發(fā)現(xiàn),isInterrupted被聲明為native方法,取決于JVM底層的實現(xiàn)。

    實際上,JVM內(nèi)部確實為每個線程維護了一個中斷標記。但應用程序不能直接訪問這個中斷變量,必須通過下面幾個方法進行操作:

    public class Thread {
        //設置中斷標記
        public void interrupt() { ... } 
        //獲取中斷標記的值
        public boolean isInterrupted() { ... }
        //清除中斷標記,并返回上一次中斷標記的值
        public static boolean interrupted() { ... }  
    }

    通常情況下,調(diào)用線程的interrupt方法,并不能立即引發(fā)中斷,只是設置了JVM內(nèi)部的中斷標記。因此,通過檢查中斷標記,應用程序可以做一些特殊操作,也可以完全忽略中斷。

    你可能想,如果JVM只提供了這種簡陋的中斷機制,那和應用程序自己定義中斷變量并輪詢的方法相比,基本也沒有什么優(yōu)勢。

    JVM內(nèi)部中斷變量的主要優(yōu)勢,就是對于某些情況,提供了模擬自動“中斷陷入”的機制。

    在執(zhí)行涉及線程調(diào)度的阻塞調(diào)用時(例如wait、sleep和join),如果發(fā)生中斷,被阻塞線程會“盡可能快的”拋出InterruptedException。因此,我們就可以用下面的代碼框架來處理線程阻塞中斷:
    try {
        //wait、sleep或join
    }
    catch(InterruptedException e) {
        //某些中斷處理工作
    }
    所謂“盡可能快”,我猜測JVM就是在線程調(diào)度調(diào)度的間隙檢查中斷變量,速度取決于JVM的實現(xiàn)和硬件的性能。   

    然而,對于某些線程阻塞操作,JVM并不會自動拋出InterruptedException異常。例如,某些I/O操作和內(nèi)部鎖操作。對于這類操作,可以用其他方式模擬中斷:

    1)java.io中的異步socket I/O

    讀寫socket的時候,InputStream和OutputStream的read和write方法會阻塞等待,但不會響應java中斷。不過,調(diào)用Socket的close方法后,被阻塞線程會拋出SocketException異常。

    2)利用Selector實現(xiàn)的異步I/O

    如果線程被阻塞于Selector.select(在java.nio.channels中),調(diào)用wakeup方法會引起ClosedSelectorException異常。

    3)鎖獲取

    如果線程在等待獲取一個內(nèi)部鎖,我們將無法中斷它。但是,利用Lock類的lockInterruptibly方法,我們可以在等待鎖的同時,提供中斷能力。
    另外,在任務與線程分離的框架中,任務通常并不知道自身會被哪個線程調(diào)用,也就不知道調(diào)用線程處理中斷的策略。所以,在任務設置了線程中斷標記后,并不能確保任務會被取消。因此,有以下兩條編程原則:
    1)除非你知道線程的中斷策略,否則不應該中斷它。

        這條原則告訴我們,不應該直接調(diào)用Executer之類框架中線程的interrupt方法,應該利用諸如Future.cancel的方法來取消任務。

    2)任務代碼不該猜測中斷對執(zhí)行線程的含義。

        這條原則告訴我們,一般代碼遇在到InterruptedException異常時,不應該將其捕獲后“吞掉”,而應該繼續(xù)向上層代碼拋出。

    總之,Java中的非搶占式中斷機制,要求我們必須改變傳統(tǒng)的搶占式中斷思路,在理解其本質(zhì)的基礎上,采用相應的原則和模式來編程。

相關文章

  • mac系統(tǒng)剛安裝的idea打不開的問題及解決

    mac系統(tǒng)剛安裝的idea打不開的問題及解決

    這篇文章主要介紹了mac系統(tǒng)剛安裝的idea打不開的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java?Semaphore共享鎖實現(xiàn)原理解析

    java?Semaphore共享鎖實現(xiàn)原理解析

    這篇文章主要為大家介紹了Semaphore共享鎖實現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 自定義@RequestBody注解如何獲取JSON數(shù)據(jù)

    自定義@RequestBody注解如何獲取JSON數(shù)據(jù)

    這篇文章主要介紹了自定義@RequestBody注解如何獲取JSON數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • SpringBoot詳解如何實現(xiàn)讀寫分離

    SpringBoot詳解如何實現(xiàn)讀寫分離

    當響應的瓶頸在數(shù)據(jù)庫的時候,就要考慮數(shù)據(jù)庫的讀寫分離,當然還可以分庫分表,那是單表數(shù)據(jù)量特別大,當單表數(shù)據(jù)量不是特別大,但是請求量比較大的時候,就要考慮讀寫分離了.具體的話,還是要看自己的業(yè)務...如果還是很慢,那就要分庫分表了...我們這篇就簡單講一下讀寫分離
    2022-05-05
  • java中HashMap的7種遍歷方式與性能分析

    java中HashMap的7種遍歷方式與性能分析

    本文主要介紹了java中HashMap的7種遍歷方式與性能分析,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java11中基于嵌套關系的訪問控制優(yōu)化詳解

    Java11中基于嵌套關系的訪問控制優(yōu)化詳解

    Java(和其他語言)通過內(nèi)部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關于Java11中基于嵌套關系的訪問控制優(yōu)化的相關資料,需要的朋友可以參考下
    2022-01-01
  • SpringBoot使用Sa-Token實現(xiàn)登錄認證

    SpringBoot使用Sa-Token實現(xiàn)登錄認證

    本文主要介紹了SpringBoot使用Sa-Token實現(xiàn)登錄認證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • 圖文詳解OkHttp的超時時間

    圖文詳解OkHttp的超時時間

    HTTP是現(xiàn)代應用常用的一種交換數(shù)據(jù)和媒體的網(wǎng)絡方式,高效地使用HTTP能讓資源加載更快,節(jié)省帶寬,OkHttp是一個高效的HTTP客戶端,下面這篇文章主要給大家介紹了關于OkHttp超時時間的相關資料,需要的朋友可以參考下
    2021-10-10
  • 淺談Java高并發(fā)解決方案以及高負載優(yōu)化方法

    淺談Java高并發(fā)解決方案以及高負載優(yōu)化方法

    這篇文章主要介紹了淺談Java高并發(fā)解決方案以及高負載優(yōu)化方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Java的關鍵字與標識符小結(jié)

    Java的關鍵字與標識符小結(jié)

    這篇文章主要介紹了Java的關鍵字與標識符,總結(jié)整理了Java各種常見的關鍵字與標識符功能、用法及操作注意事項,需要的朋友可以參考下
    2020-04-04

最新評論