7

对于大多数任务,我想以不同的速率定期执行许多任务。不过,有些任务可能会安排为同时执行。此外,一个任务可能需要在另一个任务当前正在执行时开始执行。

我还想通过为其设置一个对象来自定义每个任务,该任务将在执行时对其进行操作。

通常,任务将在 2 到 30 分钟的周期内执行,大约需要 4-5 秒,有时执行时长达 30 秒。

我发现Executors.newSingleThreadedScheduledExecutor(ThreadFactory)这几乎正是我想要的,除了如果一个新任务恰好被安排执行而另一个任务已经在执行,它可能会给我带来问题。这是因为 Executor 由单个执行线程备份。

另一种方法是使用Executors.newScheduledThreadPool(corePoolSize, ThreadFactory),但这需要我在池中创建多个线程。我想避免在必要之前创建线程,例如,如果我有两个或多个任务由于它们的执行计划冲突而碰巧需要并行执行。

对于上述情况,Executors.newCachedThreadPool(ThreadFactory)似乎可以做我想做的事,但是我无法安排我的任务。我认为缓存和预定执行程序的组合最好,但我无法在 Java 中找到类似的东西。

您认为实现上述内容的最佳方法是什么?

4

2 回答 2

1

不是ScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int)

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(0);

你需要什么?0corePoolSize

corePoolSize- 保留在池中的线​​程数,即使它们是空闲的,除非allowCoreThreadTimeOut已设置

于 2012-10-04T08:22:20.723 回答
1

我猜你将无法做到这一点ScheduledExecutor,因为它使用DelayedWorkQueue而 asnewCachedThreadPool使用ThreadPoolExecutor SynchronousQueue作为工作队列。

因此,您不能将ScheduledThreadPoolExecutor的实现更改为那样。

于 2012-10-04T09:23:14.493 回答