创建线程池有三大方法七大参数:
三大方法为:
1:Executors.newSingleThreadExecutor();单一线程 2:Executors.newFixedThreadPool(5);创建固定线程池的大小 3:Executors.newCachedThreadPool();可伸缩,遇强则强
七大参数为:
1:corePoolSize 核心线程池大小
2:maximumPoolSize最大核心线程池大小
3:keepAliveTime 超时了没有人调用就会被释放
4:TimeUnit 超时单位
5:workQueue 阻塞队列
6:threadFactory 线程工厂
7:handle 拒绝策略
拒绝策略又分为四种拒绝策略,分别为:
1:new ThreadPoolExecutor.AbortPolicy() 线程满了,但还有线程进入,则不处理,并抛出异常
2:new ThreadPoolExecutor.CallerRunsPolicy() 哪里来的去哪里 会输出main
3:new ThreadPoolExecutor.DiscardPolicy() 队列满了,丢掉任务,但是不会抛出异常
4:new ThreadPoolExecutor.DiscardOldestPolicy() 队列满了,尝试和最早的竞争,不会抛出异常
如何去定义自己的最大线程数量。
1:cpu密集形,电脑几核就定义为几,可以保持cpu的效率最高
2:io密集形, >判断你程序中十分耗io的线程
程序。15个大型任务,io十分占用资源。
推荐使用直接手动去创建线程池。
public static void main(String[] args) {
// ExecutorService threadPool = Executors.newSingleThreadExecutor();//单一线程
// ExecutorService threadPool = Executors.newFixedThreadPool(5);//创建固定线程池的大小
// ExecutorService threadPool = Executors.newCachedThreadPool();//可伸缩,遇强则强
//corePoolSize 核心线程池大小
//maximumPoolSize最大核心线程池大小
//keepAliveTime 超时了没有人调用就会被释放
//TimeUnit 超时单位
// workQueue 阻塞队列
//threadFactory 线程工厂
//handle 拒绝策略
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,//正常工作的线程个数
5, //最大可以工作的线程个数
10, //线程释放时间
TimeUnit.MICROSECONDS, //线程释放时间单位
new LinkedBlockingDeque<>(3), //超过3个线程等待则出发最大线程
Executors.defaultThreadFactory(), //
new ThreadPoolExecutor.DiscardOldestPolicy());
//最大承载线程数= deque +max个数
/**
* 四种拒绝策略
*new ThreadPoolExecutor.AbortPolicy() 线程满了,但还有线程进入,则不处理,并抛出异常
*new ThreadPoolExecutor.CallerRunsPolicy() 哪里来的去哪里 会输出main ok
*new ThreadPoolExecutor.DiscardPolicy() 队列满了,丢掉任务,但是不会抛出异常
*new ThreadPoolExecutor.DiscardOldestPolicy() 队列满了,尝试和最早的竞争,不会抛出异常
*/
try {
for (int i = 1; i <= 10; i++) {
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName() + " ok");
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
threadPool.shutdown();
}
}