public class ThreadPoolDemo {
public static void main(String[] args) {
//第一中获取的方式
ExecutorService service = Executors.newFixedThreadPool(10);
//第二种获取方式
/**
* 直接new ThreadPoolExecutor()对象 并且手动指定参数
* 1 corePoolSize : 线程池的核心线程数量 线程池创建出来就会new Thread() 5个
* 2 maxmumPoolSize:最大线程数量 线程池支持最大的线程数
* 3 keepAliveTime 存活时间 当线程数大于核心线程 空闲的线程的存活时间 8-5=3
* 4 utils 存活时间单位
* 5 BlockingQueue<Runnable> 阻塞队列 当线程数超过了核心线程数 那么新的请求到来就会加入到阻塞队列中 下的实现类有很多 LinkedBlockingQueue 的默认构造方法的大小是integer.max的最大值 我们需要手动设定大小
* 6 ThreadFactory 创建线程的工厂对象
* 7 RejectedExecutionHandler 当线程数大于最大线程数的时候会执行的淘汰策略
* 当请求超过LinkedBlockingQueue 的阻塞队列时 就会开启最大线程来 消费阻塞队列中的请求
* 当队列 满了 最大线程也满了 那么就需要淘汰策略来
*/
ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5,
100,
10,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(1000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);
poolExecutor.execute(() -> {
System.out.println("--------->"+Thread.currentThread().getName());
});
}
}
当线程池刚创建出来的时候就初始化了5个核心线程数
当请求达到线程池中
若请求数大于5时 就会将多于的请求放入阻塞队列中
有最大线程数来消化剩余的请求
当请求数超过到阻塞队中的数量 且在设置的时间内没有线程来处理阻塞队列中的请求时
那么就会执行淘汰策略 拒绝后面的请求到来
比如有一个线程 core :5 max:50 queue:100 如果并发是200 线程池是怎么处理的?
首先 200个中的前面5个被核心线程处理 然后6-105会加入到阻塞队列中 然后106到155的请求
在最大线程数中,那么会创建对应的线程来处理这些请求,之后剩下的45个请求会被直接放弃
