奈學:Executor框架的概述

奈學教育發表於2020-08-18
  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的相關原理。
本文來源於:奈學開發者社群,如有侵權,請聯絡我刪除~


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69976011/viewspace-2712732/,如需轉載,請註明出處,否則將追究法律責任。

相關文章