寻找 Java 的能够回退到串行执行的线程池

Looking for Java's ThreadPool with the ability to fallback to serial execution

我正在寻找一个线程池实现,当池中没有线程立即可用时,它不会等待,而是求助于串行执行,或者以其他方式让调用者知道一些计划执行的任务会等待线程池取回当前繁忙的线程。

我试图达到的最终效果是尽可能并行执行,当线程池完全饱和时,在当前线程中串行执行剩余的任务——也就是说,已经进行了调度尝试——而不是等到线程池取回另一个线程。

虽然这看起来可行,但我仍然认为正确地完成它需要大量的工作——也许主要是测试方面的工作,确保所有极端情况都得到妥善解决等)。

如果这种支持在 JDK 的线程相关库 类 中以一种或另一种形式随时可用,我想避免重新发明轮子。

如果其他一些广为人知的库(如 Guava 或 Apache Commons)提供该功能,我也很想知道。

您可以通过 standard ThreadPoolExecutor:

实现您想要的
  • 要在没有线程可用时停止任务排队,请使用 SynchronousQueue 作为队列实现。
  • 要在池中没有可用线程时让调用者 运行 提交任务,请使用 ThreadPoolExecutor.CallerRunsPolicy 作为任务拒绝策略。

这两个参数可以通过调用构造函数来设置:

ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, timeUnit,
    new SynchronousQueue<>(), new ThreadPoolExecutor.CallerRunsPolicy())