线程池终止
优雅行退出
shutdown() 如果调用了shutdown方法,则线程池处理SHUTDOWN状态,此时线程池不能够接受新的任务,它会等待所有任务执行完毕
强迫行退出
shutdownNow() 如果调用了shutdownNow()方法 则线程池处于STOP状态,此时线程池不能接受新的任务,并且会去尝试终止正在执行的任务。
为什么不建议使用Executors构建线程池
Executors提供的很多默认的使用的都是*的LInkedBlockingQueue,在高负载技术场景下,*队列很容易导致OOM(OutOfMemory ,内存溢出)。因此,强烈建议使用有界队列
//Executors 类中 线程池构造方法 大部分都是LinkedBlockingQueue *队列
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue *队列<Runnable>());
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}
为什么不建议使用Executors静态工厂构建线程池
FixedThreadPool和SingleThreadPool
允许的请求队列(底层实现是LinkedBlockingQueue) 长度为Integer.MAX_VALUE ,可能会堆积大量的请求 导致 OOM
CachedThreadPool和ScheduledThreadPool
允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,导致OOM
避免使用Executors创建线程池,主要是避免使用其中的默认实现,我们可以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池。在创建的同时,给BlockQueue指定容量就可以了