线程池
三大方法
创建线程池有三大方法
ExecutorService threadPool = Executors.newSingleThreadExecutor(); //单个线程
ExecutorService threadPool = Executors.newFixedThreadPool(5);//多个线程
ExecutorService threadPool = Executors.newCachedThreadPool();//遇强则强
七大参数
源码分析
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
可以看到 不管用哪个方法创建 本质都是
//本质: ThreadPoolExecutor()
public ThreadPoolExecutor(int corePoolSize, //核心线程池大小
int maximumPoolSize,//最大核心线程池大小
long keepAliveTime,//超时了没有人调用就会释放
TimeUnit unit,//超时单位
BlockingQueue<Runnable> workQueue//阻塞队列
) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
所以我们选择直接用底层
创建直接用底层
ThreadPoolExecutor threadPool= new ThreadPoolExecutor(
2,
5,
3,
TimeUnit.SECONDS,
new LinkedBlockingDeque<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() //拒绝策略 抛出异常
);
四种拒绝策略
new ThreadPoolExecutor.AbortPolicy() //满了 还进 不处理这个人的 拒绝策略 抛出异常
new ThreadPoolExecutor.CallerRunsPolicy() //哪里的去哪里
new ThreadPoolExecutor.DiscardPollcy()//队列满了,丢掉任务,不会抛出异常
new ThreadPoolExecutor.DiscardoldestPolicy()//队列满了,尝试去和最早的竞争,不会抛出异常