?类比营业厅排队,
?如下图所示:? 核心线程3个,最大线程5,排队队列3。 最多可以容纳8个,否则抛出异常
五个窗口全开,队列满,容纳8个任务,但是第九个就阻塞了
package com.yg.springboot.threadPool;
import java.util.concurrent.*;
public class Test3 {
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(
3, // 核心线程数
5, // 最大线程数
1L, //超时时间,指定时间内没有任务,关闭线程
TimeUnit.SECONDS, // 时间的单位
new ArrayBlockingQueue<>(3), //排队队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy()); //拒绝策略,直接默认的抛出异常
// 核心线程3个,最大线程5,排队队列3。
int n = 9;
for (int i = 0; i < n; i++) {
int finalI = i;
executorService.execute(() -> {
System.out.println(Thread.currentThread().getName() + "----办理任务。"+ finalI);
});
}
// 关闭线程池
executorService.shutdown();
}
/*
n=3: (3个核心线程处理任务)
pool-1-thread-3----办理任务。
pool-1-thread-2----办理任务。
pool-1-thread-1----办理任务。
n=6:(3个核心线程处理任务,3个在排队)
pool-1-thread-3----办理任务。
pool-1-thread-2----办理任务。
pool-1-thread-1----办理任务。
pool-1-thread-2----办理任务。
pool-1-thread-3----办理任务。
pool-1-thread-1----办理任务。
n=7:(3个核心线程处理任务,3个在排队,由于有第7个任务,所以开启线程4处理任务)
pool-1-thread-2----办理任务。
pool-1-thread-2----办理任务。
pool-1-thread-1----办理任务。
pool-1-thread-1----办理任务。
pool-1-thread-4----办理任务。
pool-1-thread-3----办理任务。
pool-1-thread-2----办理任务。
n=8:(3个核心线程处理3个任务,3个在排队,由于还有2个任务,所以开启线程4、线程5处理任务)
pool-1-thread-1----办理任务。
pool-1-thread-5----办理任务。
pool-1-thread-4----办理任务。
pool-1-thread-4----办理任务。
pool-1-thread-3----办理任务。
pool-1-thread-2----办理任务。
pool-1-thread-4----办理任务。
pool-1-thread-1----办理任务。
N=9:(开启5个线程,排队3个,还有1个没有队伍可以排队被拒绝)
pool-1-thread-2----办理任务。1
Exception in thread "main" java.util.concurrent.RejectedExecutionException: Task com.yg.springboot.threadPool.Test3$$Lambda$1/1792845110@47f37ef1 rejected from java.util.concurrent.ThreadPoolExecutor@19bb089b[Running, pool size = 5, active threads = 3, queued tasks = 0, completed tasks = 5]
pool-1-thread-4----办理任务。6
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
pool-1-thread-4----办理任务。4
pool-1-thread-4----办理任务。5
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
pool-1-thread-1----办理任务。0
pool-1-thread-3----办理任务。2
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
at com.yg.springboot.threadPool.Test3.main(Test3.java:19)
pool-1-thread-5----办理任务。7
pool-1-thread-2----办理任务。3
*/
}
|