corePoolSize → 創建新線程 (需全域鎖)。corePoolSize → 任務入 BlockingQueue。maximumPoolSize → 創建新線程 (需全域鎖)。maximumPoolSize → 拒絕任務,調用 RejectedExecutionHandler.rejectedExecution()。// 固定大小 10 的線程池 new ThreadPoolExecutor(10, 10, 1, TimeUnit.DAYS, new LinkedBlockingQueue<>());
| 參數 | 說明 |
|---|---|
| corePoolSize | 核心線程數。任務提交時若運行線程少於此值,創建新線程。可用 prestartAllCoreThreads() 預先啟動。 |
| maximumPoolSize | 最大線程數。佇列滿時若未達此值,創建新線程。若使用無界佇列則此參數無效。 |
| keepAliveTime | 非核心線程閒置存活時間。任務多且耗時短可調大提高利用率。 |
| TimeUnit | 時間單位:天/時/分/秒/毫秒/微秒/奈秒。 |
| workQueue | 任務佇列。常用:ArrayBlockingQueue(有界)、LinkedBlockingQueue(無界、高吞吐)、SynchronousQueue(直接遞交)、PriorityBlockingQueue(優先級)。 |
| ThreadFactory | 線程創建工廠,可自定義線程名稱、優先級等。 |
| RejectedExecutionHandler | 拒絕策略。預設 AbortPolicy 拋異常;另有 CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy。 |
execute(Runnable):無返回值,無法判斷執行成功與否。submit(Callable):返回 Future,可透過 get() 獲取結果或捕獲異常;get(timeout) 可設超時。ExecutorService executor = Executors.newScheduledThreadPool(3);
executor.execute(() -> System.out.print("runnable"));
Future future = executor.submit(() -> "callable");
System.out.print(future.get()); // 阻塞直到完成
結合 Executor 與 BlockingQueue,誰先完成誰先返回,而非提交順序。
ExecutorService executor = Executors.newFixedThreadPool(11); BlockingQueue> queue = new LinkedBlockingQueue<>(); CompletionService cs = new ExecutorCompletionService<>(executor, queue); for (int i = 0; i < 10; i++) { cs.submit(() -> { Thread.sleep(new Random().nextInt(10000)); return Thread.currentThread().getName(); }); } for (int i = 0; i < 10; i++) { System.out.println(cs.take().get()); // 取出已完成任務 } executor.shutdown();