JDK1.5之前,我們如果想要使用Java線程來完成相關任務,一般涉及兩個類,一個是Thread類,一個Thread對象在啟動(start)之後會建立一個關聯的本地作業系統線程,随後會自動回調run方法。另一個是Runnable接口,可以看作 run方法的抽象,代表線程任務。通過Runnable和Thread的配合可以編寫我們自己的多線程邏輯。
可以看到,此時Java對于多線程程式設計的支援還是比較原始的,功能也并不多。是以,在JDK1.5的JUC包中,對Java的多線程應用做了一次全面的擴充,比如新lock鎖、并發容器等,還有一個重要的擴充就是出現了Executor執行架構。
Executor執行架構将Java線程的應用做了更細緻的功能劃分,并且進行了功能的增強,大概包括三個部分:
線程任務
JDK1.5之前,隻有Runnable代表線程任務,對于受檢異常,必須手動在try catch中處理,不支援throws聲明可能抛出的異常,不支援任務傳回值。
JDK1.5的時候,出現了Callable接口,可以看作Runnable的增強:對于受檢異常,可以不用在try catch中處理,支援throws聲明可能抛出的異常,并且支援任務傳回值。
執行器
JDK1.5之前,線程任務的執行需要我們手動建立Thread對象、傳入任務、并調用start方法,一個任務對應一個線程,它們之間的關聯非常緊密,這樣對于線程任務的管理、線程資源的複用等功能幾乎沒有,或者隻能自己手動實作,非常麻煩。
JDK1.5的時候,出現了Executor線程池。線程池作為任務執行器,我們隻需要建立指定的線程池,随後将線程任務傳入線程池中,由線程池來确定是将任務直接配置設定給池中的線程去執行、還是建立線程并執行、或者是加入任務隊列等待等等邏輯,使用線程池之後我們不再需要手動建立線程去執行,并且可以實作線程的複用以及線程任務的管理等強大的功能。執行器(線程池)将任務與線程解耦!
異步執行結果
JDK1.5之前,線上程任務啟動之後,對于線程任務監控幾乎沒有,我們不知道任務有沒有完成,也沒辦法定義任務的傳回值等一系列資訊。
JDK1.5的時候,出現了Future接口以及它的各種實作。這個接口體系代表了線程任務異步計算的結果,通常與Callable線程任務連用。利用了Future設計模式,在一個線程A執行線程任務的時候,我麼可以在另一個線程B中異步的通過Future的實作的相關方法完成判斷對應線程任務是否執行完畢、是否被取消、手動取消正在執行的線程任務、以及從執行完畢的線程任務中擷取傳回值等功能。
有了執行架構,我們隻需建立線程任務、然後交給指定的線程池去執行,執行完畢之後等待擷取傳回結果即可,不再需要關注線程的建立、開啟、執行、回收等基礎性的中間工作,将任務與線程解耦,程式員更加的關注線程任務本身(這裡是和業務相關的),有利于多線程程式的開發!
如果想要使用執行架構,隻需要看相關api文檔即可!那麼我們有必要深入了解執行架構嗎?當然時間充足的情況下是有必要的,隻有我們知道了執行架構的原理之後,才能更好的使用它。執行架構屬于JDK自帶的基礎架構,經曆了時間和衆多Java開發者的考驗,不求能夠手寫,僅僅學習它的設計精華,包括各種設計模式,同時避開隐藏的坑,對于程式員個人的後續職業發展也是具有很大幫助的!
線程任務、執行器、執行結果這三部分,都可以圍繞着Executor線程池展開,是以下面我們将從Executor入手,并且會穿插介紹Callable和Future的相關原理。
本文來源于:奈學開發者社群,如有侵權,請聯系我删除~