ThreadPoolExecutor 可擴展性

 

到這裏對於這個線程池還只是介紹了一小部分。ThreadPoolExecutor 具有很強的可擴展性,不過擴展它的前提是要熟悉它的工作方式。後面的文章將會介紹如何擴展 ThreadPoolExecutor 類。 

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

  除了 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())); 

 

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