线程池

以下内容整理自互联网,仅用于个人学习


线程池基础

public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor( 
                      CORE_POOL_SIZE,MAXIMUM_POOL_SIZE,KEEP_ALIVE,TimeUnit.SECONDS, 
                      sPoolWorkQueue,sThreadFactory 
                      );

当一个任务加入到线程池时:

  • 如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
  • 如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
  • 当线程池中的线程数量大于 corePoolSize时,如果某线程(非核心线程)空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

处理任务的优先级

  1. 核心线程corePoolSize
  1. 任务队列workQueue
  2. 最大线程maximumPoolSize

如果三者都满了,使用handler处理被拒绝的任务(一般为抛出java.util.concurrent.RejectedExecutionException异常)

线程类型

  • FixedThreadPool:线程数量固定的线程池,线程处于空闲状态时不会被回收,除非线程被关闭。当所有线程都处于活动状态时,新的任务都会处于等待状态,直到有线程空闲出来。
  • CachedThreadPool:线程数量不固定,只有非核心线程,可以放任意多个线程(Integer.MAX_VALUE),线程池里所有线程处于活动状态时,创建新的线程处理新来的任务。否则利用闲置的线程处理新任务。线程池里空闲线程有超时机制,时长为60秒。
  • ScheduledThreadPool:核心线程数量是固定的,非核心线程是没有限制。当非核心线程闲置时会被立即回收。
  • SingleThreadExector:内部只有一个核心线程,确保所有任务在同一个线程中按顺序执行。

线程池的优点

  • 重用线程池中的线程,避免因为线程的创建和销毁所带来的性能开销
  • 能有效控制线程池的最大并发数,避免大量线程之间因互相抢占系统资源而导致阻塞。
  • 能够对线程进行简单的管理,并提供定时执行以及指定间隔循环执行等功能。

你可能感兴趣的:(线程池)