Java Executor 框架學習總結

2021-09-23 06:50:08 字數 2288 閱讀 6246

大多數併發都是通過任務執行的方式來實現的。一般有兩種方式執行任務:序列和並行。

class singlethreadwebserver  

} } 

class threadpertaskwebserver  

}; new thread(task).start(); 

} } 

}  當然上面的這兩種方式都是有問題的。單執行緒的問題就是併發量會是瓶頸,多執行緒版本就是無限制的建立執行緒會導致資源不足問題。

executor 框架

任務是一組邏輯工作單元,而執行緒是使任務非同步執行的機制。

jdk 提供了 executor 介面:

public

inte***ce executor  

雖然 executor 介面比較簡單,但是卻是非同步任務執行框架的基礎,該框架能支援多種不同型別的任務執行策略。它提供了一種標準的方式把任務的提交過程與執行過程進行了解 耦。用 runnable 來代表任務。executor 的實現提供了對生命週期的支援以及統計資訊應用程式管理等機制。

executor 是基於生產者消費者模式的,提交任務的操作相當於生產者,執行任務的執行緒相當於消費。

基於 executor 的 webserver 例子如下:

public

class taskexecutorwebserver  

}; exec.execute(task); 

} } 

}  另外可以自己實現 executor 來控制是併發還是並行的,如下面**:

/**

* 執行已提交的 runnable 任務的物件。

* 此介面提供一種將任務提交與每個任務將如何執行的機制(包括執行緒使用的細節、排程等)分離開來的方法。

* 通常使用 executor 而不是顯式地建立執行緒。**

* @author renchunxiao**/

public

class executordemo  

}); 

executor executor2 = new serialexecutor(); 

executor2.execute(new runnable()  

}); 

} } 

/*** 建立乙個執行緒來執行 command

** @author renchunxiao**/

class threadexecutor implements executor  

} /**

* 序列執行 command

** @author renchunxiao**/

class serialexecutor implements executor  

}執行緒池

執行緒池就是執行緒的資源池,可以通過 executors 中的靜態工廠方法來建立執行緒池。

jvm 只有在所有非守護執行緒全部終止後才會退出,所以,如果無法正確的關閉 executor,那麼 jvm 就無法結束。

為了解決執行服務的生命週期問題,有個擴充套件 executor 介面的新介面 executorservice。

public

inte***ce executorservice extends executor  

executorservice 生命週期有三種狀態:執行、關閉、已終止。executorservice 在初始建立時處於執行狀態。shutdown 方法會平緩關閉:不在接受新的任務,並且等待已經執行的任務執行完成(包括那些還未開始的任務)。shutdownnow 方法將粗暴關閉:它將嘗試取消所有執行中的任務,並且不再啟動佇列中尚未開始的任務。所有任務都執行完成後進入到已終止狀態。

callable 和 future

executor 框架使用 runnable 作為基本的任務表示形式。runnable 是一種有侷限性的抽象,它的 run 方法不能返回值和丟擲乙個受檢查異常。

許多任務實際上是存在延時的計算,例如資料庫查詢,從網路獲取資源。對於這些任務,callable 是更好的抽象,它認為 call 將返回乙個值,並且可能丟擲異常。

executor 執行的任務有四個生命週期階段:建立、提交、開始和完成。由於有些任務需要很長時間有可能希望取消,在 executor 框架當中,已提交未開始的任務可以取消。

future 表示乙個任務的生命週期,並且提供了相應的方法來判斷是否已經完成或取消,以及獲取任務的結果和取消任務等。

Java Executor 框架學習總結

大多數併發都是通過任務執行的方式來實現的。一般有兩種方式執行任務 序列和並行。class singlethreadwebserver class threadpertaskwebserver new thread task start 當然上面的這兩種方式都是有問題的。單執行緒的問題就是併發量會是瓶...

Java Executor執行緒池

什麼是執行緒池?將若干執行緒放在一起,同一進行管理,排程,和監控 執行緒池就相當於 包工頭 為什麼要有執行緒池?執行緒池有如下的優點 1.降低資源消耗 重複利用已有的執行緒,減少了不斷建立銷毀執行緒的資源消耗 2.提高響應速度 在任務到達時,不需要等待執行緒的建立就可以直接執行任務 3.便於管理 使...

學使用qeephp框架

1.在原有的能夠正常執行的apache2 php5 和mysql5 環境環境上 瀏覽器訪問的目錄中即可 例如http localhost 對應d www 目錄,那麼將qeephp 放置在d www qeephp 2.1 目錄中就可以通過http localhost qeephp 2.1 訪問到qee...