背景
为了能够方便的使用线程池,java提供的简单的实现方式。但是《阿里巴巴Java开发手册》中不建议使用。具体描述如下。
单一工作线程线程池
单一工作线程线程池,实现源码如下
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
由于使用的堵塞队列是LinkedBlockingQueue,LinkedBlockingQueue阻塞队列是无界的,如果工作线程执行非常耗时的任务,会导致堆积大量的请求。
固定线程池线程
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
由于使用的堵塞队列是LinkedBlockingQueue,LinkedBlockingQueue阻塞队列是无界的,如果工作线程执行非常耗时的任务,会导致堆积大量的请求。
创建缓存线程池线程
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
阻塞队列是SynchronousQueue,改阻塞队列在存入元素时,必须先取出元素,因此会创建大量的线程。