线程池学习记录

线程池

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());
}

ThreadPoolExecutor类

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,若入队失败(等待队列满了)则开启非核心线程执行工作

ExecutorService的submit和execute方法的区别:

1.submit方法是在中ExecutorService类定义接口AbstractExecutorService类实现,而execute方法则是在基类Execut类定义ThreadPoolExecutor中实现
2.submit方法有三个方法,可以接收不同的参数(如Callable,Runnble)
3.submit方法会返回一个Futuer对象,通过这个对象可以查询task的当前状态(是否取消,完成)其实submit最后也是调用execute方法,可以理解为是execute的扩展

ThreadPoolExecutor中的Work说明

Work类是线程池一个状态管理,runnable最后会封装成Work对象,Work继承于AbstractQueuedSynchronizer(AQS,参考锁的实现),锁门线程池也类似于锁的竞争和释放。

你可能感兴趣的:(线程池学习记录)