Executors 为工厂方法,方法如下:
//一个可缓存线程池 public static ExecutorService newCachedThreadPool(); public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory); //一个固定线程数量的线程池 public static ExecutorService newFixedThreadPool(int nThreads); public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory); //一个定长线程池,支持定时及周期性任务执行 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize); public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory); //一个单线程化的线程池 public static ExecutorService newSingleThreadExecutor(); public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory); //一个单线程化的线程池,支持定时及周期性任务执行 public static ScheduledExecutorService newSingleThreadScheduledExecutor(); public static ScheduledExecutorService newSingleThreadScheduledExecutor(ThreadFactory threadFactory); newCachedThreadPool() 方法:该方法返回一个可根据实际情况调整线程数量的线程池。线程池的数量不确定,若有空闲线程可复用,则会优先使用复用线程。如果无复用线程,会创建新的线程。执行完毕后,放回线程池。核心线程数量为0,线程存活时间为 60秒,最大线程数量为 Integer.MAX_VALUE 。newFixedThreadPool() 方法:该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行。若没有,则新的任务会被暂存在一个任务队列中。核心线程、最大线程都是 固定线程数量。newScheduledThreadPool() 方法:该方法返回一个 ScheduledExecutorService 类,可以定时循环执行任务,指定线程数量。newSingleThreadExecutor() 方法:该方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列中,待线程空闲,按先入先出的顺序执行队列中的任务。newSingleThreadScheduledExecutor() 方法:一个单例的可循环执行的线程池,返回一个 ScheduledExecutorService 类。队列只能为 BlockingQueue ,可以使用如下几种 BlockingQueue :
SynchronousQueue队列:直接提交队列,没有容量,每插入一个操作都要等待一个相应的删除操作。使用该队列,通常需要设置很大的最大线程。ArrayBlockingQueue队列:有界的队列。LinkedBlockingQueue队列:无界的队列。除非系统资源耗尽,否则不存在任务入队失败的情况。PriorityBlockingQueue队列:优先任务队列。一个特殊的无界队列。ArrayBlockingQueue 和 LinkedBlockingQueue 都是先进先出,但是 PriorityBlockingQueue 可根据任务自身的优先级顺序先后执行。ThreadFactory 创建新的线程工厂,代码如下
public interface ThreadFactory { Thread newThread(Runnable r); }默认的 ThreadFactory 为 Executors 中的 DefaultThreadFactory 代码如下:
static class DefaultThreadFactory implements ThreadFactory { private static final AtomicInteger poolNumber = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; DefaultThreadFactory() { SecurityManager s = System.getSecurityManager(); group = (s != null) ? s.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-"; } public Thread newThread(Runnable r) { Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(), 0); if (t.isDaemon()) t.setDaemon(false); if (t.getPriority() != Thread.NORM_PRIORITY) t.setPriority(Thread.NORM_PRIORITY); return t; } }