Executors 是java提供创建线程的的工厂方法(阿里规范不允许使用此类)提供以下方法
1.newSingleThreadExecutor 单线程模式,同个时间段只会执行一个线程
存在问题: LinkedBlockingQueue为workQueue(线程等待队列),无参构造会创建Integer.MAX_VALUE个线程,若等待线程足够多时会出现OOM
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
2.newCachedThreadPool 缓存线程池,会回收利用闲置的线程
存在问题: maximumPoolSize设置为无限大,则会oom
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
3.newFixedThreadPool固定线程池,通过构造传入规定执行的线程数
存在问题: 跟newSingleThreadExecutor问题一样
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
4.newScheduledThreadPool定时执行线程线程池可以设置开始和周期时间,是ThreadPoolExecutor的子类
**存在问题:**同newCachedThreadPool一致
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {...}
corePoolSize:表示核心线程数量。
maximumPoolSize:表示线程池最大能够容纳同时执行的线程数,必须大于或等于 1。如果和 corePoolSize 相等即是固定大小线程池。
keepAliveTime:表示线程池中的线程空闲时间,当空闲时间达到此值时,线程会被销毁直到剩下 corePoolSize 个线程。
unit:用来指定 keepAliveTime 的时间单位,有 MILLISECONDS、SECONDS、MINUTES、HOURS 等。
workQueue:等待队列,BlockingQueue 类型。当请求任务数大于 corePoolSize 时,任务将被缓存在此 BlockingQueue 中。
threadFactory:线程工厂,线程池中使用它来创建线程,如果传入的是 null,则使用默认工厂类 DefaultThreadFactory。
handler:执行拒绝策略的对象。当 workQueue 满了之后并且活动线程数大于 maximumPoolSize 的时候,线程池通过该策略处理请求。
如果线程数大于corePoolSize,则keepAliveTime起作用 也就是说闲置的线程超过时间会回收
maximumPoolSize和workQueue发关系:当线程数大于corePoolSize时,会先入队到workQueue,若入队失败(等待队列满了)则开启非核心线程执行工作
1.submit方法是在中ExecutorService类定义接口AbstractExecutorService类实现,而execute方法则是在基类Execut类定义ThreadPoolExecutor中实现
2.submit方法有三个方法,可以接收不同的参数(如Callable,Runnble)
3.submit方法会返回一个Futuer对象,通过这个对象可以查询task的当前状态(是否取消,完成)其实submit最后也是调用execute方法,可以理解为是execute的扩展
Work类是线程池一个状态管理,runnable最后会封装成Work对象,Work继承于AbstractQueuedSynchronizer(AQS,参考锁的实现),锁门线程池也类似于锁的竞争和释放。