- 使用线程池的好处
- 可重复利用线程资源,避免频繁创建和销毁。
- 统一管理系统中的线程,避免创建过多的线程影响系统性能。
- 创建一个线程池
ExecutorService executorService = new ThreadPoolExecutor(
10,//corePoolSize
50,//maximumPoolSize
3,//keepAliveTime
TimeUnit.SECONDS,//unit
new LinkedBlockingDeque<>(200),//workQueue
Executors.defaultThreadFactory(),//threadFactory
new ThreadPoolExecutor.AbortPolicy()//handler
);
executorService.execute(()->{
System.out.println("execute");
});
1.corePoolSize:核心线程数,线程池中会一直保存的线程数量
2.maximumPoolSize 最大线程数量
3.keepAliveTime 当线程数超过核心线程数但是超过keepAliveTime时间段后依然没有任务,则销毁
4.unit 时间单位
5.workQueue 如果提交的任务超过的最大线程数,则可保存在任务队列中
6.threadFactory 线程创建工厂
7.handler如果队列也满了,按照指定的拒绝策略进行保存或丢弃
CallerRunsPolicy:当队列与最大线程数都满了时,同时执行任务
AbortPolicy:丢弃任务并抛异常
DiscardPolicy:丢弃任务不抛异常,丢弃的是最新的任务
DiscardOldestPolicy:丢弃任务不抛异常,丢弃的是最老的任务
此处要注意的是
1.如果corePoolSize为10,maximumPoolSize为50,此时最大只能创建50个而不是60个。
2.当队列中的任务满了以后,才开始根据最大线程数执行的大小去创建新线程执行,而不是当核心线程数不够时直接创建新线程。