java线程池回顾

  • 线程池相关类
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:由调用线程处理该任务 

  • 默认的四种线程池
Executors是一个工具类,提供一些静态工厂,生成一些常用较优的线程池(建议使用,不用了解线程池原理)

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:创建一个定长线程池,此线程池支持定时以及周期性执行任务的需求

  • 相关队列
SynchronousQueue:没有数据缓冲的BlockingQueue,每个插入操作必须等待另一个线程的对应移除操作
LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列大小,则默认为Integer.MAX_VALUE

  • 参考文档
引用

以上两篇文章讲的很详细,感谢作者!

猜你喜欢

转载自sheungxin.iteye.com/blog/2346994