为什么Java Executors类没有提供预定的缓存线程池?

BD *_*ill 36 java concurrency

Executors提供newCachedThreadPool()newScheduledThreadPool(),但不newCachedScheduledThreadPool(),这里是什么给了?我有一个接收突发消息的应用程序,并且需要在每个消息的固定延迟之后安排相当长的处理步骤.时间限制不是非常严格,但如果我超过池大小,我宁愿在运行中创建更多线程,然后在不活动期间将它们修剪回来.有没有我在并发库中遗漏的东西,还是我需要自己编写?

Ben*_*nes 8

根据设计,ScheduledThreadPoolExecutor是固定大小.您可以使用提交到普通ExecutorService的单线程版本来执行任务.此事件线程+工作池相当容易协调,灵活性弥补了专用线程.我过去曾使用它来替换TimerTasks和其他非关键任务,以将公共执行程序用作系统范围的池.


GKi*_*lin 7

建议在这里为什么ScheduledThreadPoolExecutor只接受固定数量的线程?解决方法:

scheduledExecutor = new ScheduledThreadPoolExecutor(128); //no more than 128 threads
scheduledExecutor.setKeepAliveTime(10, TimeUnit.SECONDS);
scheduledExecutor.allowCoreThreadTimeOut(true);
Run Code Online (Sandbox Code Playgroud)

  • **使用此解决方法的注意事项**:请参阅[ScheduledThreadPoolExecutor的文档](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html):_"此外,将corePoolSize设置为零或使用**allowCoreThreadTimeOut**几乎绝不是一个好主意,因为一旦它们有资格运行,这可能会使池没有线程来处理任务."_ (5认同)
  • 经过一番摸索之后,我无法获得“ ScheduledThreadPoolExecutor”来展示这种行为。在默认实现下,如果线程池为空,则“ ensurePrestart()”(一个由所有调度方法调用的私有方法)将创建一个用于处理新任务的工作程序。github要点:https://gist.github.com/Groostav/600edf739a39cbbb33cbd64ad385d621 (2认同)

ska*_*man 3

java.util.concurrent.Executors无非是构建执行器的常见安排的静态便捷方法的集合。

如果您想要 中未提供的特定内容Executors,请随意构建您自己的实现类实例,并使用 中的示例Executors作为指导。

  • 恕我直言,这个答案对所述问题具有误导性,因为它表明人们可以简单地构造一个满足这一特定要求的执行器。但是阅读[ScheduledThreadPoolExecutor](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledThreadPoolExecutor.html)的文档表明调用继承自[ThreadPoolExecutor](http)的几个调优方法://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html)“没有任何有用的效果”,因此“ScheduledThreadPoolExecutor”似乎不支持所需的行为。 (4认同)