创建线程池,使用juc(java.util.concurrent包)的ThreadPoolExecutor
五个参数,核心线程数,最大线程数,未工作线程的存活时间,时间单位,等待队列
创建线程池不能用executor,因为用的是LinkedBlockingDeque,是堵塞队列,会一直增加任务,造成OOM,推荐使用new ArrayBlockingQueue<>();
new ThreadPoolExecutor(1,1,1, TimeUnit.SECONDS,new ArrayBlockingQueue<>(3),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
其中Executors.defaultThreadFactory()为线程工厂
new ThreadPoolExecutor.AbortPolicy()为默认的拒绝策略
四种常见线程池:
newFixedThreadPool:固定线程数,等待队列为阻塞队列
newCachedThreadPool:线程数不足时,有空闲线程会直接使用,否则会创建新的,使用与执行大量短生命周期的异步任务
newSingleThreadExecutor:单线程的线程池
newScheduledThreadPool:可以执行定时任务和周期性的任务
线程池的状态
使用AtomicInteger来存储状态和线程数量,有32位,前3位代表状态,后29位代表线程数量