public class Principle {
public static void main(String[] args) {
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
for (int i = 1; i <= 6; i++) {
TaskThred t1 = new TaskThred("任務" + i);
executor.execute(t1);
}
executor.shutdown();
}
}
class TaskThred implements Runnable {
private String taskName;
public TaskThred(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + taskName);
}
}
結果
pool-1-thread-1任務1
pool-1-thread-2任務2
pool-1-thread-2任務3
pool-1-thread-2任務4
pool-1-thread-2任務5
pool-1-thread-3任務6
現在是有創建三個線程在執行任務
如果把循環改成5次
結果
pool-1-thread-2任務2
pool-1-thread-2任務3
pool-1-thread-1任務1
pool-1-thread-2任務4
pool-1-thread-1任務5
說個結論,在配置2個核心線程,4個最大線程,3個緩存隊列情況下
1.當要執行的任務 ≤ 核心線程+隊列緩存,就只會有2個工作線程在執行任務,2就是我配的核心線程數(工作線程)
2.當要執行的任務 > 核心線程+隊列緩存,多一個任務就多創建一個新的線程執行,總的線程小於最大線程數
3.當要執行的任務 > 最大線程數+隊列緩存,第8個任務直接報錯
核心線程就是在不大於隊列+核心線程數情況下會調用的工作線程,配3個那就會有3個工作線程在執行任務,
隊列+核心線程數<N個執行任務≤隊列+最大線程數,就會有N個工作線程在執行任務