Executors
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 可根据任务自身的优先级顺序先后执行。
拒绝策略
- AbortPolicy 策略(默认策略):该策略会直接抛出异常,阻止系统正常工作。
- CallerRunsPolicy 策略:只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
- DiscardOldestPolicy 策略:该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。
- DiscardPolicy 策略:该策略默默地丢弃无法处理的任务,不予任何处理。如果允许任务丢失,该方案是最好的一个。
ThreadFactory
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;
}
}