第六章 任務執行
6.1 在線程中執行任務
串行-》多線程-》有限個多線程
6.2 executor框架
通過有界隊列可以防止高負荷程序過度消耗內存
java.lang.concurrent提供了線程池作爲實現executor框架的一部分
executor接口:提供生產者-消費者模式
基於executor的web服務器:
public class TaskExecutionWebServer { private static final int NTHREADS = 100; private static final Executor exec = Executors.newFixedThreadPool(NTHREADS); public static void main(String[] args) throws IOException { ServerSocket socket = new ServerSocket(80); while (true) { final Socket connection = socket.accept(); Runnable task = new Runnable() { public void run() { handleRequest(connection); } }; exec.execute(task); } } private static void handleRequest(Socket connection) { // request-handling logic here } }
通過繼承executor接口,就可以實現不同的服務器處理方式
線程池:與task queue密切相關,在工作隊列中保存了所有待執行的任務,工作線程提前建立,然後從工作隊列中取出任務執行,執行完畢重新等待下一個任務,工作線程可以重用。
通過調用executors中的靜態方法來創建線程池:newFixedThreadPool newCachedThreadPool newSingleThreadPool newScheduledThreadPool
executor的生命週期:通過executor的子接口executorServer來實現生命週期管理
延遲任務與週期任務:Timer 或者用scheduledThreadPoolExecutor來替代
6.3 找出可利用的並行性
攜帶結果的任務callable 和future
callable:它認爲主入口點(call)將返回一個值或者拋出一個異常
future:表示一個任務的生命週期,並提供了相應的方法來判定是否已經完成或者被取消
executorServer中的所有submit方法將一個runnable或者callable提交給executor,從而返回一個future來獲得任務的執行結果或者取消任務。還可以顯式的爲runnable或者callable實例化一個futureTask
completionServer:將executor和blockQueue結合起來,
爲任務設置時限
invokeall