赞
踩
1.降低资源消耗:很多线程执行的时间很短,如果每次需要执行线程都去创建和销毁线程,会产生很多不必要的开销。
2.提高线程的可管理性
大致结构:在Executors类中,定义了几个静态内部类,如:
DelegatedExecutorService FinalizableDelegatedExecutorService DelegatedScheduledExecutorService
工作中经常会用到Executors类去new一个线程池,一共有12个方法,分为5种线程池:
- public static ExecutorService newFixedThreadPool(int nThreads) {
- // 固定大小线程池
- return new ThreadPoolExecutor(nThreads, nThreads,
- 0L, TimeUnit.MILLISECONDS,
- new LinkedBlockingQueue<Runnable>());
- }
- public static ExecutorService newCachedThreadPool() {
- /* 处理大量短时间工作任务的线程池
- (1)试图缓存线程并重用,当无缓存线程可用时,会创建新的工作线程
- (2)如果线程闲置的时间超过阈值,则会被终止并移出缓存
- (3)系统长时间闲置的时候,不会消耗什么资源
- */
- return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
- 60L, TimeUnit.SECONDS,
- new SynchronousQueue<Runnable>());
- }
- public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
- // 创建唯一的工作者线程来执行任务,如果线程异常结束,会有另一个线程取代它
- return new DelegatedScheduledExecutorService
- (new ScheduledThreadPoolExecutor(1));
- }
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
// 定时或周期性的工作调度,多个线程
return new ScheduledThreadPoolExecutor(corePoolSize);
}public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
// 定时或周期性的工作调度,单个线程
return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
}
public static ExecutorService newWorkStealingPool() { // 内部会构建ForkJoinPool,利用work-stealing算法,并行处理任务,不保证处理顺序 return new ForkJoinPool (Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); }
newSingleThreadScheduledExecutor和
newScheduledThreadPool再加上另外4个,每个方法都有参数重载(ThreadFactory,java只有参数类型和个数重载,不能以返回值重载),所以总共是12个创建线程池的静态方法。
把大任务分割为若干个小任务并行执行,最终汇总每个小任务结果得到大任务结果的框架。更大的利用多处理器带来的好处,利用所有可用的运算能力来提升性能,类同于mapReduce原理。
ForkJoin会将任务分发给线程池中的工作线程,使用work-stealing算法(简单来说:某个线程从其他队列里窃取任务来执行)
ForJoinPool最适合计算密集型任务
int corePoolSize:核心线程数 当池中正在运行的线程数(包括空闲线程)小于corePoolSize时,新建线程执行任务
int maximumPoolSize:最大线程数 当队列里的任务数达到上限,并且池中正在运行的线程数小于maximumPoolSize,对于新加入的任务,新建线程
long keepAliveTime:空闲线程存活时间
TimeUnit unit:时间单位
BlockingQueue<Runnable> workQueue:阻塞队列 当池中正在运行的线程数大于等于corePoolSize时,新插入的任务进入workQueue排队(如果workQueue长度允许),等待空闲线程来执行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。