2014-01-05 34 views
2

我正在經歷Java Concurrency in Practice,並且在8.3.1線程創建和拆卸下遇到了一個聲明。這裏是聲明 - 「實現嘗試將池維持在這個大小,即使沒有要執行的任務,除非工作隊列已滿,否則不會創建比此更多的線程。」爲了驗證一樣,我寫了一個小碼Executor corepoolsize爲零有限LinkedBlockingQueue

package com.executor; 

import java.util.concurrent.BlockingQueue; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.LinkedBlockingQueue; 
import java.util.concurrent.RejectedExecutionException; 
import java.util.concurrent.SynchronousQueue; 
import java.util.concurrent.ThreadPoolExecutor; 
import java.util.concurrent.TimeUnit; 


public class MyJobSubmitterThread extends Thread { 

    public static ExecutorService objExecutorService = new ThreadPoolExecutor(0, 1, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(2)); 

    public static int counter = 1; 
    @Override 
    public void run() { 
     //Using Runnable 
     while(!objExecutorService.isShutdown()){ 
      try{ 
      objExecutorService.execute(new RandomNumberGenerator()); 
      if(counter > 10){ 
       objExecutorService.shutdownNow(); 
       if(objExecutorService.isTerminated()){ 
        System.out.println("Runnable - Terminated"); 
       } 
       //objExecutorService.execute(new RandomNumberGenerator()); 
      } 
      int objBlockingQueueSize = ((ThreadPoolExecutor)objExecutorService).getQueue().size(); 
      ++counter; 
      }catch (RejectedExecutionException e) { 
       // TODO: handle exception 
       e.printStackTrace(); 
      } 
     } 

    } 
} 

故意不把RandomNumberGenerator類的代碼作爲這個問題的背景下是不需要的。

根據上面引用的語句,一個線程不應該被創建並開始,除非第三個任務被提交到隊列中,但是與此相反,線程被創建並啓動。當線程在10秒後死亡保持活力的時間,它再次創造了一份工作剛剛提交。當我在Java中看了看執行方法的代碼1.7源,它就像

else if (workerCountOf(recheck) == 0) 
      addWorker(null, false); 

可能有人請解釋爲什麼什麼是JCIP書中陳述或反之亦然代碼的行爲是不同的?我在這裏錯過了一點嗎?

回答

2

該書中的陳述是準確的,但需要注意的是,ThreadPoolExecutor確保至少有一個線程在有工作要做時運行(即corePoolSize == 0是一種特殊情況)。

+0

@ jtahlborn-謝謝,我編輯了一個程序並將最大大小設置爲2並放置了必要的調試點,我可以驗證您的語句 – 100pipers

0

您將核心池大小設置爲0,並將最大池大小設置爲1.這意味着它最多隻有一個線程來執行任務。由於線程數大於核心池大小(1> 0),因此線程在保持活動時間保持空閒狀態後將被刪除。所以我認爲這種情況很正常。

的ThreadPoolExecutor試圖保持線程數等於核心池的大小,通過刪除空閒線程,如果線程數超過核心池大小和每一個,直到達到核心池大小時創建新的線程更大。

相關問題