介紹 Java 自帶的線程池(2)

原文:http://blog.csdn.net/yidinghe/article/details/3891947

前文


java.util.concurrent.ThreadPoolExecutor 類提供了豐富的可擴展性。你可以通過創建它的子類來自定義它的行爲。例如,我希望當每個任務結束之後打印一條消息,但我又無法修改任務對象,那麼我可以這樣寫:


ThreadPoolExecutor executor = new ThreadPoolExecutor(size, maxSize, 1, TimeUnit.DAYS, queue) {
    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        System.out.println("Task finished.");
    }

};


除了 afterExecute 方法之外,ThreadPoolExecutor 類還有 beforeExecute() 和 terminated() 方法可以重寫,分別是在任務執行之前和整個線程池停止之後執行。



除了可以添加任務執行前後的動作之外, ThreadPoolExecutor 還允許你自定義當添加任務失敗後的執行策略。你可以調用線程池的 setRejectedExecutionHandler() 方法,用自定義的 RejectedExecutionHandler 對象替換現有的策略。 ThreadPoolExecutor 提供 4 個現有的策略,分別是:

  • ThreadPoolExecutor.AbortPolicy:表示拒絕任務並拋出異常
  • ThreadPoolExecutor.DiscardPolicy:表示拒絕任務但不做任何動作
  • ThreadPoolExecutor.CallerRunsPolicy:表示拒絕任務,並在調用者的線程中直接執行該任務
  • ThreadPoolExecutor.DiscardOldestPolicy:表示先丟棄任務隊列中的第一個任務,然後把這個任務加進隊列。

這裏是一個例子:


ThreadPoolExecutor executor = new ThreadPoolExecutor(size, maxSize, 1, TimeUnit.DAYS, queue);

executor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());



除此之外,你也可以通過實現 RejectedExecutionHandler 接口來編寫自己的策略。下面是一個例子:


ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 6, 1, TimeUnit.SECONDS, queue,
        new RejectedExecutionHandler() {
            public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
                System.out.println(String.format("Task %d rejected.", r.hashCode()));
            }
        }

);


發佈了6 篇原創文章 · 獲贊 4 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章