把线程池(ThreadPoolExecutor)理解为一个工厂:
创建这个工厂的规定:
- int corePoolSize :正式工数量
- int maximumPoolSize :最多工人数量(正式工+临时工)
- long keepAliveTime :工人多久不干活就辞退
- TimeUnit unit :上面工人不干活时间的单位
- BlockingQueue<Runnable> workQueue :工厂订单列表
- ThreadFactory threadFactory : 工厂人事部 (招工-创建线程用)
- RejectedExecutionHandler handler :工厂灾害处理单位
下面对Executors 快速创建的几类线程池解读:
1.缓存线程池:
Executors.newCachedThreadPool();
它的创建方法:
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
解读:
这家工厂没有正式员工,所有员工都是零时工,可以无限招工,没有工人数量上限,工人60秒没干活就辞退,可以无限接订单;创建的时候可以自定义人事部,灾害处理单位是ThreadPoolExecutor默认的new AbortPolicy(),订单列表满了,抛出RejectedExecutionException异常,并拒绝新的订单,由于该工厂的订单列表是无限的,所以基本不会用到灾害处理单位;
2.固定线程池
Executors.newFixedThreadPool(int nThreads)
它的创建方法:
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
解读:
这家工厂在创建时候,必须指定正式工数量,并且严格不招收零时工,这里不是不干活立马辞退,而是永远不辞退正式工,可以无限接订单;创建的时候可以自定义人事部,灾害处理单位是ThreadPoolExecutor默认的new AbortPolicy(),订单列表满了,抛出RejectedExecutionException异常,并拒绝新的订单,由于该工厂的订单列表是无限的,所以基本不会用到灾害处理单位;
3.定时任务线程池
Executors.newScheduledThreadPool(int corePoolSize);
它的创建方法:
return new ScheduledThreadPoolExecutor(corePoolSize);
//ScheduledThreadPoolExecutor是继承ThreadPoolExecutor的类
//ScheduledThreadPoolExecutor的构造:
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
解读:
这家工厂在创建时候,必须指定正式工数量;但是它可以无限制招收零时工;10毫秒不干活就辞退!该工厂的订单列表也是无限的,但是具有优先级,可以指定时间开工的订单;创建的时候可以自定义人事部;
4.单线程线程池
Executors.newSingleThreadExecutor();
它的创建方法:
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
通俗解读:
该工厂只有一个工人,不招收零时工,嗯?感觉就是一个自由职业者,不是一个工厂,不存在辞退问题,可以无限制接单,可以自定义人事部,默认的灾害处理单位,用不上;该工厂有个特点,订单没完成的时候,工人死掉了(异常)它会自动再招个工人继续完成工作,并且在没有工作时候,会被垃圾回收装置关闭工厂。
网友评论