原文: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()));
}
}
);