java併發編程實戰學習筆記之任務執行

第六章 任務執行

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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章