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

时间:2010-07-19 13:10:05

标签: java concurrency

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

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

此处建议Why does ScheduledThreadPoolExecutor only accept a fixed number of threads?解决方法:

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

答案 2 :(得分:3)

java.util.concurrent.Executors只不过是构建执行者常见安排的静态便捷方法的集合。

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

答案 3 :(得分:-2)

像skaffman所说,Executors只是工厂方法的集合。如果您需要特定实例,则可以随时检查所有现有Executor实现者​​。在你的情况下,我认为调用ScheduledThreadPoolExecutor的各种构造函数之一是个好主意。