多线程与高并发(七)--线程池

Executor

  • 提供了void execute(Runnable command);方法。执行command任务,将任务的定义以及运行分离。

ExecutorService

  • 继承了Executor,完善了任务执行器的生命周期。
  • 提供了submit方法(异步执行任务),将任务完成的返回值封装到Future中。

Callable

  • 和Runnable类似,提供了call方法。与Runnable的run方法不同的是,call方法有返回值。

Future

  • 代表任务执行的结果,将任务完成的返回值封装到future。
  • 通过get()方法获取任务返回值。
    • get是阻塞方法,知道可以获取结果才会往下执行。

FutureTask

  • 既是一个Future也是一个Callable(实现了RunnableFuture,RunnableFuture继承了Runnable以及Future)。

CompletableFuture

  • 提供了对单个以及批量任务的管理方案。

ThreadPoolExecutor

    • 继承自AbstractExecutorService(AbstractExecutorService实现了ExecutorService,ExecutorService继承了Executor)。
    • 内部维护了两个集合,一个是线程集合,一个是任务集合。
    • 七个参数简介
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runn able> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler);
    • corePoolSize:核心线程数,核心线程是即使空闲时间超过了生存时间也不会被回收。
    • maximumPoolsize:最大线程数,最多有多少个线程。
    • keepAliveTime:生存时间,线程超过多久没有执行任务会被回收,数量等于核心线程数时不再回收线程。
    • unit:生存时间的单位
    • workQueue:任务队列,BlockingQueue(使用不同的BlockingQueue会产生不同的线程池)。
    • threadFactory:线程工厂,需要实现ThreadFactory,可以自定义实现。
    • handler:拒绝策略,线程池所有线程都在忙碌状态,而且任务队列已满,需要执行拒绝策略。拒绝策略可以自定义,默认提供了四种(一般情况都是自定义策略)。
      • Abort:抛异常。
      • Discard:扔掉,不抛异常。
      • DiscardOldest:扔掉排队时间最久的。
      • CallerRuns:调用者处理任务。

ForkJoinPool

  • 分解汇总的任务。
  • 用很少的线程可以执行很多的任务(子任务)TPE做不到先执行子任务。
  • CPU密集型

Executors

  线程工具类,可以看做是线程池的工厂。

  • SingleThreadExecutor
    • 线程池中只有一个线程。
    • 为什么要有单线程的线程池?
      • 有任务队列,可以管理线程的生命周期。
  • CachedThreadPool
    • 核心线程数为0,最大线程数时Integer.MAX_VALUE,生存时间为60s,任务队列是SynchronousQueue(来一个任务就会被线程执行)。
  • FixedThreadPool
    • 核心线程=最大线程(固定数量线程池)。
  • Cached VS Fixed
    • 如果任务请求不平均,使用Cached。
    • 如果任务请求比较平稳,使用Fixed。

 

上一篇:协程原理深度剖析 进程线程协程原理一课通收藏


下一篇:C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic