- new Thread弊端
- 每次new Thread新建对象,性能差
- 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM
- 缺少更多功能,如更多执行、定期执行、线程中断
- 线程池的好处
- 重用存在的线程,减少对象创建、消亡的开销,性能佳
- 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞
- 提供定时执行、定期执行、单线程、并发数控制等功能
重要核心参数
workQueue:阻塞队列,存储等待执行的任务,很重要,会对线程池运行过程产生重大影响
线程池的五种状态
RUNNING:能够接受新提交的任务,也能处理阻塞队列中的任务,
(pool.shutdown())SHUTDOWN:关闭状态,不能接受新提交的任务,但是能够处理阻塞队列中保存的任务
(pool.shutdownNow())STOP:不能接受新的任务,也不能处理阻塞队列中的任务,会中断正在处理中的线程。
TIDYING:阻塞队列为空,线程池中的工作线程数为0
(pool.terminated()) TERMINATED
线程池的相关方法
execute():提交任务,交给线程池执行
getActiveCount():当前线程池中正在执行任务的线程数量
Executors.newCachedThreadPool
Executors.newFixedThreadPool
Executors.newScheduledThreadPool
@Slf4j
public class ThreadPoolExample4 {
public static void main(String[] args) {
ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
// executorService.schedule(new Runnable() {
// @Override
// public void run() {
// log.warn("schedule run");
// }
// }, 3, TimeUnit.SECONDS);
executorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
log.warn("schedule run");
}
}, 1, 3, TimeUnit.SECONDS);
// executorService.shutdown();
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
log.warn("timer run");
}
}, new Date(), 5 * 1000);
}
}
Executors.newSingleThreadExecutor
原文:https://www.cnblogs.com/xujie09/p/11703686.html