线程池流程图

代码
public class ExectorTest {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor
(2,4,3, TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),new ThreadPoolExecutor.DiscardPolicy());
for (int i = 1; i <20; i++) {
String data = "task@" + i;
System.out.println(data);
threadPoolExecutor.execute(new ThreadPoolRunnable(data));
}
System.out.println("start test ---------------");
}
static class ThreadPoolRunnable implements Runnable{
private Object taskData;
public ThreadPoolRunnable(Object taskData) {
this.taskData = taskData;
}
@Override
public void run() {
System.out.println("run - runnableData: " + taskData + " | " + Thread.currentThread());
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
taskData = null;
}
}
参数含义

corePoolSize 核心数
maximumPoolSize 最大的数
keepAliveTime 就是 当线程数大于核心线程数时,在终止前,多余的空闲线程等待新任务的最长时间。
BlockingQueue<Runnable> workQueue 等待队列
RejectedExecutionHandler 拒绝策略
- CallerRunsPolicy:线程池让调用者去执行。
- AbortPolicy:如果线程池拒绝了任务,直接报错。
- DiscardPolicy:如果线程池拒绝了任务,直接丢弃。
- DiscardOldestPolicy:如果线程池拒绝了任务,直接将线程池中最旧的,未运行的任务丢弃,将新任务入队。
举例
- 如果创建 1~20个线程,拒绝策略是DiscardPolicy,
- 那么线程放入的顺序则是core12link345max67
- 因为max虽然是4,但是包括了core的2.所以,max中还剩下2个名额。
- 取出则是先从core max后link。那么可能是1267345