我正在經歷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書中陳述或反之亦然代碼的行爲是不同的?我在這裏錯過了一點嗎?
@ jtahlborn-謝謝,我編輯了一個程序並將最大大小設置爲2並放置了必要的調試點,我可以驗證您的語句 – 100pipers