常见的线程池及其特点

  • Post author:
  • Post category:其他




常见的线程池及其特点


  • Executors.newFixedThreadPool(nThreads)

    :固定容量的线程池。corePoolSize为nThreads,maximumPoolsize为nThreads,keepAliveTime为0ms,采用了无界队列。

    缺点在于容易造成大量内存占用,可能会导致OOM。

  • Executors.newSingleThreadExecutor()

    :单个线程的线程池。corePoolSize为1,maximumPoolsize为1,keepAliveTime为0ms,采用了无界队列。

    缺点在于当请求堆积的时候,可能会占用大量的内存。

  • Executors.newCachedThreadPool()

    :可缓存线程池,特点是具有自动回收多余线程的功能。corePoolSize为0,maximumPoolsize为Integer.MAX_VALUE,keepAliveTime为60s,采用了直接交换。

    缺点在于maximumPoolsize为Integer.MAX_VALUE,这可能会创建数量非常多的线程,甚至导致OOM。

  • Executors.newScheduledThreadPool(corePoolSize)

    :支持定时及周期性任务执行的线程池。corePoolSize为corePoolSize,maximumPoolsize为Integer.MAX_VALUE,keepAliveTime为0ns,采用了优先队列。采用schedule()方法可以设置要执行的任务,以及执行的时间间隔,采用scheduleAtFixedRate()方法可以设置任务,第一次的延迟时间,以及执行的时间间隔。

  • Executors.newWorkStealingPool()

    :JDK1.8后加入的线程池,与前面的线程池有很大的不同。通常来说,当这个任务可以产生子任务(如树的遍历、处理矩阵)的时候,才适合这种场景。这种线程池拥有一定的窃取能力,每一个线程之间会合作,任务会放在线程独有的队列中,而不是公共的队列,线程之间会有互相帮助的现象。

    注意点:1. 为了提高效率,任务最好不要加锁,因为任务可能被不同的线程执行;2. 不保证执行顺序。



版权声明:本文为weixin_44864347原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。