<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    xylz,imxylz

    關注后端架構、中間件、分布式和并發編程

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      111 隨筆 :: 10 文章 :: 2680 評論 :: 0 Trackbacks

    并發包引入的工具類很多方法都會拋出一定的異常,這些異常描述了任務在線程池中執行時發生的例外情況,而通常這些例外需要應用程序進行捕捉和處理。

    例如在Future接口中有如下一個API:

     

    java.util.concurrent.Future.get(long, TimeUnit) throws InterruptedException, ExecutionException, TimeoutException;

     

    前面的章節中描述了Future類的具體實現原理。這里不再討論,但是比較好奇的拋出的三個異常。

    這里有一篇文章(Java 理論與實踐: 處理 InterruptedException)描述了InterruptedException的來源和處理方式。簡單的說就是線程在執行的過程中被自己或者別人中斷了。這時候為了響應中斷就需要處理當前的異常。

    對于java.lang.Thread而言,InterruptedException也是一個很詭異的問題。

    中斷一個線程Thread.interrupt()時會觸發下面一種情況:

    如果線程在調用 Object 類的 wait()、wait(long) 或 wait(long, int) 方法,或者該類的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法過程中受阻,則其中斷狀態將被清除,它還將收到一個 InterruptedException。

    檢測一個線程的中斷狀態描述是這樣的Thread.interrupted():

    測試當前線程是否已經中斷。線程的中斷狀態 由該方法清除。換句話說,如果連續兩次調用該方法,則第二次調用將返回 false(在第一次調用已清除了其中斷狀態之后,且第二次調用檢驗完中斷狀態前,當前線程再次中斷的情況除外)。 

    也就是說如果檢測到一個線程已經被中斷了,那么線程的使用方(掛起、等待或者正在執行)都將應該得到一個中斷異常,同時將會清除異常中斷狀態。

     

    V innerGet(long nanosTimeout) throws InterruptedException, ExecutionException, TimeoutException {
        
    if (!tryAcquireSharedNanos(0, nanosTimeout))
            
    throw new TimeoutException();
        
    if (getState() == CANCELLED)
            
    throw new CancellationException();
        
    if (exception != null)
            
    throw new ExecutionException(exception);
        
    return result;
    }

     

    上面獲取任務結果的方法實現中,將在獲取鎖的過程中得到一個中斷異常。代碼java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(int, long)描述了這種情況:

        public final boolean tryAcquireSharedNanos(int arg, long nanosTimeout) throws InterruptedException {
        
    if (Thread.interrupted())
            
    throw new InterruptedException();
        
    return tryAcquireShared(arg) >= 0 ||
            doAcquireSharedNanos(arg, nanosTimeout);
        }

     


    這里在獲取鎖的時候檢測線程中斷情況,如果被中斷則清除中斷位,同時拋出一個中斷異常。為什么如此做?因為我們的線程在線程池中是被重復執行的,所以一旦線程被中斷后并不會退出線程,而是設置中斷位,等候任務隊列自己處理線程,從而達到線程被重復利用的目的。有興趣的可以參考代碼java.util.concurrent.ThreadPoolExecutor.Worker.runTask(Runnable)。這里在關閉線程池時就會導致中斷所有線程。

    除了InterruptedException 異常我們還發現了一個全新的異常java.util.concurrent.TimeoutException,此異常是用來描述任務執行時間超過了期望等待時間,也許是一直沒有獲取到鎖,也許是還沒有執行完成。

    在innerGet代碼片段中我們看到,如果線程在指定的時間無法獲取到鎖,那么就會得到一個超時異常。這個很好理解,比如如果執行一個非常耗時的網絡任務,我們不希望任務一直等待從而占用大量的資源,可能在一定時間后就會希望取消此操作。此時超時異常很好的描述了這種需求。

    與此同時,如果取消了一個任務,那么再次從任務中獲取執行結果,那么將會得到一個任務被取消的異常java.util.concurrent.CancellationException。

    除了上述異常外,還將得到一個java.util.concurrent.ExecutionException異常,

    這是因為我們的提交的任務java.util.concurrent.Callable在call()方法中允許拋出任何異常,另外常規的線程執行也可能拋出一個RuntimeException,所以這里簡單包裝了下所有異常,當作執行過程中發生的異常ExecutionException拋出。

    以上就是整個異常體系,所有并發操作的異常都可以歸結于上述幾類。

    很多情況下處理時間長度都是用java.util.concurrent.TimeUnit,這是一個枚舉類型,用來描述時間長度。其中內置了一些長度的單位。其中包括納秒、微秒、毫秒、秒、分、時、天。例如超時操作5秒,可以使用

    Future.get(5,TimeUnit.SECONDS) 或者 Future.get(5000L,TimeUnit.MILLISECONDS)

    當然一種單位的時間轉換成另一種單位的時間也是非常方便的。另外還有線程的sleep/join以及對象的wait操作的便捷操作。

     



    ©2009-2014 IMXYLZ |求賢若渴
    posted on 2011-07-12 23:15 imxylz 閱讀(17403) 評論(3)  編輯  收藏 所屬分類: Java Concurrency

    評論

    # re: 深入淺出 Java Concurrency (36): 線程池 part 9 并發操作異常體系 2011-07-15 08:48 gameboy120
    終于又有新文章了,博主最近很忙啊  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (36): 線程池 part 9 并發操作異常體系[未登錄] 2011-07-19 20:33 楊羅羅
    一直在看,許多線程類文章寫的很深入,值得研究  回復  更多評論
      

    # re: 深入淺出 Java Concurrency (36): 線程池 part 9 并發操作異常體系 2011-08-18 18:10 yintiefu
    樓主的這個系列看了幾天終于看完了?。》浅8兄x   回復  更多評論
      


    ©2009-2014 IMXYLZ
    主站蜘蛛池模板: 免费人成再在线观看网站| 日韩亚洲Av人人夜夜澡人人爽| 久久久久se色偷偷亚洲精品av| 日韩电影免费观看| 亚洲区小说区图片区QVOD| 日本三级在线观看免费| 亚洲av无码专区在线播放| 99久久免费看国产精品| 亚洲午夜精品一区二区公牛电影院 | 亚洲一区二区三区精品视频 | 男人天堂免费视频| 国产精品亚洲一区二区三区在线 | 久久www免费人成看国产片| 国产aⅴ无码专区亚洲av麻豆 | 亚洲校园春色小说| 男女超爽刺激视频免费播放 | 亚洲人配人种jizz| 免费特级黄毛片在线成人观看| 亚洲狠狠色丁香婷婷综合| 又粗又黄又猛又爽大片免费| 性生大片视频免费观看一级| 亚洲欧洲日产国码无码网站| 在线看片免费人成视久网| 亚洲日韩一区二区一无码| 亚洲精品国产电影| 久久精品毛片免费观看| 日韩亚洲国产高清免费视频| vvvv99日韩精品亚洲| 很黄很污的网站免费| 国产成人精品日本亚洲直接| 深夜国产福利99亚洲视频| 久久久久久久久久国产精品免费| 亚洲另类古典武侠| 中文字幕在亚洲第一在线| 国产精品色拉拉免费看| 边摸边脱吃奶边高潮视频免费| 亚洲va无码va在线va天堂| 中文字幕亚洲无线码| 亚洲色自偷自拍另类小说| 青草草色A免费观看在线| 最刺激黄a大片免费网站|