简单线程池由Executors类提供
固定大小线程池newFixedThreadPool()可变大小线程池newCachedThreadPool()单一线程池newSingleThreadExecutor()单一定时任务线程池newSingleThreadScheduledExecutor()定时任务线程池newScheduleThreadPool()定时任务线程池是由ScheduledExecutorService 在ExecutorService之上扩展了定时执行任务功能得到。ScheduleExecutorService提供如下方法
public ScheduleFuture<?> schedule(Runnable command, long delay,TimeUnit unit) public ScheduleFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) public ScheduleFuture<?> scheduleAtFixedDelay(Runnable command, long initialDelay, long period, TimeUnit unit)schedule会在给定时间对任务进行一次调度。 scheduleAtFixedRate和scheduleAtFixedDelay会周期性调用。二者区别在于通常情况下scheduleAtFixedRate不关心任务执行时间,会严格按照给定周期进行调度;而scheduleAtFixedDelay则在每次任务执行完成之后才开始计算下一次调度周期。 特别的,当scheduleAtFixedRate任务时间超过调度周期,ScheduleExecutorService并不会让任务堆叠运行,而是等待任务执行完成之后立即调度下一次任务。 另外,当定时任务抛出异常而未被捕获处理时,该任务将永久性停止。
除定时任务线程池外,其余三种核心线程池均是ThreadPoolExecutor的封装。
public ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler ) corePoolSize:常态线程数量 maximumPoolSize:最大线程数量 keepAliveTime:当线程池数量超过corePoolSize时,多余的空闲线程存活时间 unit:keepAliveTime的时间单位 workQueue:被添加的任务(未被执行的) threadFactory:线程工厂 handler:拒绝策略workQueue定义了存放待执行任务的队列,由BlockingQueue接口提供,其实现类主要有如下四种:
直接提交队列SynchronousQueue SynchronousQueue并不会保存实际任务,当有新任务提交时总是尝试提交给线程池执行。若无空闲进程则尝试创建新进程,若已达最大线程则执行拒绝策略。有界任务队列ArrayBlockingQueue 定义有界任务队列时需传入最大容量参数。当有新任务提交时,若线程数小于corePoolSize则优先创建线程执行,若大于corePoolSize则任务入列等待执行,若队列已满,则在maximumPoolSize之内创建线程,若超出则执行拒绝策略。无界任务队列LinkedBlockingQueue 相对于有界任务队列,无界任务队列没有容量限制,当线程数大于corePoolSize时,任务入列。优先任务队列PriorityBlockingQueue 特殊的无界队列,相较于有界、无界队列的先入先出策略,可设定任务优先级。