【问题标题】:newFixedThreadPool() vs newCachedThreadPool() [duplicate]newFixedThreadPool() 与 newCachedThreadPool() [重复]
【发布时间】:2015-06-19 15:57:02
【问题描述】:

如果newCachedThreadPool() 创建了一个线程池,该线程池会根据需要创建新线程,但会在可用时重用以前构造的线程,而在newFixedThreadPool(int size) 的情况下,指定大小以创建指定大小的线程池。

为什么newFixedThreadPool(int size) 没有以newCachedThreadPool() 方式实现,线程池仅在需要时创建新线程并将线程限制在大小范围内?

对以上内容的任何澄清都非常有帮助。

【问题讨论】:

  • 因为那将不再是一个固定线程池了。创建的线程池都是 ThreadPoolExecutor 的实例,使用不同的选项创建。创建一个新线程需要一些时间,您可能希望在启动时使用该时间,而不是在提交新任务时。
  • @JBNizet 在固定线程池的情况下会不会不持有资源。它之间的决定更昂贵。关于它的任何见解。
  • 如果你知道你需要一定数量的线程,那么一开始就创建它们的开销会更小,如果你不能,它会快速失败,而不是做所有必要的簿记过期未使用的线程或确定是否创建更多线程。

标签: java multithreading threadpool executorservice threadpoolexecutor


【解决方案1】:

newFixedThreadPool 也懒惰地创建线程。试试这个测试:

    ThreadPoolExecutor p = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
    System.out.println(p.getPoolSize());
    p.execute(new Runnable() {public void run() {}});
    System.out.println(p.getPoolSize());

区别在于:

  1. newFixedThreadPool 的线程永不过期,而newCachedThreadPool 的线程在上次使用后 60 秒后过期
  2. newCacheThreadPool的最大活跃线程数不限

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2012-08-17
    • 1970-01-01
    • 2013-04-14
    • 2016-05-07
    • 2016-07-23
    • 2013-11-29
    相关资源
    最近更新 更多