- 线程池相关类
ExecutorService | 真正的线程池接口 |
ScheduledExecutorService | 能和Timer/TimerTask类似,解决那些需要任务重复执行的问题 |
ThreadPoolExecutor | ExecutorService的默认实现 |
ScheduledThreadPoolExecutor | 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现 |
- ThreadPoolExecutor
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)corePoolSize:核心池的大小
maximumPoolSize:池中允许的最大线程数
keepAliveTime:当线程数大于核心池的大小,终止空闲线程等待新任务的最长时间
unit:keepAliveTime参数的时间单位
workQueue:执行前用于保持任务的队列
threadFactory:线程创建工厂
handler:由于超出线程范围和队列容量而使执行被阻塞时,表示拒绝处理的策略
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程) ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
- 默认的四种线程池
newSingleThreadExecutor:单线程的线程池,串行执行所有任务,只有当前线程异常结束时才会新的线程来替代它。
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>())); }newFixedThreadPool:固定大小的线程池。根据任务量,逐渐增加线程数,直到线程池最大值保持不变。只有线程异常结束时才会新的线程来补充。
Runtime.getRuntime().availableProcessors() public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }newCachedThreadPool:可缓存的线程池,可以理解为可复用的线程池,当线程处于空闲状态(60秒未执行任务)执行回收,有需要再创建新的线程。该线程池未做大小限制,依赖JVM可以创建的最大线程数(默认线程大小1024k)。
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }newScheduledThreadPool:创建一个定长线程池,此线程池支持定时以及周期性执行任务的需求
- 相关队列
LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE
- 参考文档
引用
以上两篇文章讲的很详细,感谢作者!