java并发编程之深入学习Concurrent包(十,Executors类)

引言:

Executors类是一个用于创建线程池的工具类,用于创建几种常用的线程池及线程工厂Executor、ExecutorService、ThreadFactory、Callable等。


线程池的核心参数:

corePoolSize:线程池中的核心线程数,一般是线程池中保留的线程数,即使空闲也不会被清理,除非设置了allowCoreThreadTimeout为true。

maximumPoolSize:线程池中允许存放最大的线程数量。

keepAliveTime:非corePoolSize范围内的线程,该线程空闲的时间超过keepAliveTime时间,该线程将被终止。

workQueue:线程池中任务存放的容器队列,阻塞队列,常用的有以下几种:

ArrayBlockingQueue:数组方式有界队列,如果队列已满,则入队失败。

LinkedBlockingQueue:链表模式无界队列,如果运行的线程大于corePoolSize时,新到来的任务会入队等待,不会直接创建新的线程来执行。

SynchronousQueue:任务直接入线程池而不进入任务队列,如果没有线程则创建一个新的线程来处理该任务。

PriorityBlockingQueue:权重无界队列,根据权重进行出队操作。


queueCapacity:队列容量,注意队列容量不要设置太大或使用默认容器大小。

allowCoreThreadTimeout:是否允许核心线程空闲退出。

任务队列与线程池:

java并发编程之深入学习Concurrent包(十,Executors类)_第1张图片


Executors创建的几种常见线程池:

1.固定容量线程池:

newFixedThreadPool

说明:创建一个线程数固定的线程池,该线程池核心线程会一直运行,即使线程因异常退出,也会重新启动。

任务队列使用无界队列LinkedBlockingQueue

代码如下所示:

public static ExecutorService newFixedThreadPool(int nThreads) {

        return new ThreadPoolExecutor(nThreads, nThreads,

                                      0L, TimeUnit.MILLISECONDS,

                                      new LinkedBlockingQueue());

    }

2.单个线程的线程池

newSingleThreadExecutor

说明:线程池只有一个核心线程,核心线程会一直运行

任务队列使用无界队列LinkedBlockingQueue

代码如下所示:

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {

        return new FinalizableDelegatedExecutorService

            (new ThreadPoolExecutor(1, 1,

                                    0L, TimeUnit.MILLISECONDS,

                                    new LinkedBlockingQueue(),

                                    threadFactory));

    }

3.缓存队列线程池

newCachedThreadPool

说明:创建一个无核心线程的线程池,需要使用才新建线程,有新的任务立即新建一个线程来处理新任务,未使用的线程空闲时间超过60S会立刻销毁。

队列:SynchronousQueue

代码如下所示:

public static ExecutorService newCachedThreadPool() {

        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,

                                      60L, TimeUnit.SECONDS,

                                      new SynchronousQueue());

    }

4.定时调用线程池

newScheduledThreadPool

说明:用于执行定时或延迟执行的任务。


以上只是Executors类中的实现,后续详细的线程池实现还请关注后续详解。

你可能感兴趣的:(java并发编程之深入学习Concurrent包(十,Executors类))