@cxm-2016
2016-08-10T11:34:23.000000Z
字数 1385
阅读 1912
java
no
线程数量固定的线程池,当所有线程都处于活动状态时,新任务会处于等待状态,只有核心线程并且不会回收(无超时机制),能快速的响应外界请求。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads,
nThreads,
0L,
TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
线程数量不定,只有非核心线程没有核心线程。最大线程数是Integer.MAX_VALUE,相当于能够创建无限多的线程。由于SynchronousQueue无法插入任何任务,所以新来的任务总是会被立刻执行。该类线程适合执行大量低耗时的任务。当没有任务时,由于没有核心线程,所以实际上是几乎不占有任何系统资源的。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0,
Integer.MAX_VALUE,
60L,
TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
这是一个核心数限定,非核心线程无限的线程池。非核心线程闲置时会被立刻回收。此类线程池多用来执行定时任务和具有固定重复周期的任务
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
该线程池仅有一个核心线程,它的作用是将所有任务使用一个线程完成,不需要处理线程同步的问题。
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
}
示例:
scheduledThreadPool.schedule(command,2000,TimeUnit.MILLISECONDS);
//2000毫秒后执行command
scheduledThreadPool.schedule(command,1000,5000,TimeUnit.MILLISECONDS);
//延迟1000毫秒,每隔5000毫秒执行一次command