JUC-java.util.concurrent学习(四)
线程池
三大方法
//ExecutorService executorService = Executors.newSingleThreadExecutor();//单个线程执行任务
//ExecutorService executorService = Executors.newFixedThreadPool(3);//创建固定线程执行任务
ExecutorService executorService = 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>());
}
发现通过Executors
工具类new出来的线程池都是通过new ThreadPoolExecutor
创建出来的
七大参数
public class MyPool {
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(
2,//核心线程数
5,//最大线程数
3,//超时等待时间
TimeUnit.SECONDS,//超时等待时间单位
new LinkedBlockingDeque<Runnable>(3),//放任务的队列
Executors.defaultThreadFactory(),//默认工厂
new ThreadPoolExecutor.AbortPolicy()//拒绝策略
);
try {
for (int i = 0; i < 8; i++) {
executorService.execute(()->{
System.out.println(Thread.currentThread().getName());
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
executorService.shutdown();
}
}
}
当最大线程数加上队列容量数小于任务数量时,就会触发拒绝策略
最大线程数可以设置为电脑cpu的核数Runtime.getRuntime().availableProcessors()
四大拒绝策略
/**
* new ThreadPoolExecutor.AbortPolicy()抛出异常
* new ThreadPoolExecutor.CallerRunsPolicy()哪来的回哪去,一般main线程
* new ThreadPoolExecutor.DiscardPolicy()队列满了会丢掉新来的任务
* new ThreadPoolExecutor.DiscardOldestPolicy()队列满了会尝试获取第一个线程
*/