(二)线程池及ThreadLocal

JUC线程池架构

JUC是java.util.concurrent工具包的简称,从JDK1.5加入,用于处理高并发和多线程

image.png

Executor

函数式接口,只有一个方法void execute(Runnable command)

异步目标任务的执行者接口

ExecutorService

继承自Executor

接受异步任务并转交给执行者

Executors

静态工厂类,提供快捷创建线程池的方法

AbstractExectorService

ExecutorService 中的接口提供默认实现

ThreadPollExector

“线程池”实现类,是JUC中线程池的核心实现类

ScheduledExecutorService

完成“延时”和“周期性”任务的调度线程池接口

ScheduledThreadPoolExector

继承 ThreadPollExector 并 实现 ScheduledExecutorService

提供完成“延时”和“周期性”任务的调度的默认实现

Executors快捷创建线程4种方法

Executors快捷创建线程「方便但不建议使用」

newSingleThreadExecutor 创建 「单线程化线程池」

  • 问题:无界队列(OOM)
  • LinkedBlockingQueue
  • FIFO
  • 池中唯一线程存活时间无限
  • 新来的任务在线程池忙时阻塞

newFixedThreadPool 创建 「固定数量的线程池」

  • 问题:无界队列(OOM)
  • LinkedBlockingQueue
  • 线程数没达到固定数量,新来的任务每次都分配一个线程
  • 达到数量,新来的任务加入阻塞队列
  • 达到数量,因为任务异常死亡时,补充一个新线程

newCachedThreadPool 创建 「可缓存线程池」

  • 问题:最大线程数量不设上限(OOM,CPU资源耗尽)
  • SynchronousQueue
  • 新来一个任务,线程池中所有线程繁忙,新建线程处理新到任务
  • 若部分线程空闲超过一定时间,回收该线程

newScheduledThreadPool 创建 「可调度线程池」

  • 问题:最大线程数量不设上限(OOM,CPU资源耗尽)
  • DelayQueue
  • 被调任务执行时间大于指定的时间间隔时,不会新建线程而是等待前一次调度执行完毕

ThreadPoolExecutor 线程池

线程池的标准创建方式

使用 ThreadPoolExecutor


public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler
)

复制代码

向线程池提交任务的两种方式

execute

void execute(Runnable command)

  • 接受参数类型为Runnable
  • 无返回值

submit

Future<?> submit(Runnable task)

<T> Future<T> submit(Runnable task, T result)

<T> Future<T> submit(Callable<T> task)

  • 参数类型可以为RunnableCallable
  • 返回值为Future对象
  • 最终调用的还是execute()方法

调度方式

只有在核心线程已满,阻塞队列已满,才会创建新线程

image.png

ThreadFactory线程工厂

ThreadFactory线程工厂用于创建线程,而上述的Executors线程池工厂用于创建线程池

BlockingQueue

ArrayBlockingQueue

  • 创建时必需设置大小
  • FIFO

LinkedBlockingQueue

  • 可以设置大小
  • 不设置大小默认为无界队列
  • 吞吐量高于ArrayBlockingQueue
  • Executors.newSingalThreadExecutor
  • Executors.newFixedThreadPool

PriorityBlockingQueue

  • 具有优先级的无界队列

DelayQueue

  • 基于PriorityBlockingQueue
  • 每个元素具有过期时间
  • 只有已经的元素才会出队,队头是最快过期的元素
  • Executors.newScheduledThreadPool

SynchronousQueue

  • 同步队列
  • 不存储元素的队列
  • 每个插入操作必须等待另一个线程的移出操作
  • Executors.newCachedThreadPool

钩子方法

  • 前钩子

  • 后钩子

  • 停止钩子

猜你喜欢

转载自juejin.im/post/7036732442673152007