【发布时间】:2012-09-25 05:41:53
【问题描述】:
我有许多任务,我希望以不同的速率定期执行大多数任务。不过,有些任务可能会安排为同时执行。此外,一个任务可能需要在另一个任务当前正在执行时开始执行。
我还想通过为每个任务设置一个对象来自定义每个任务,该任务将在执行时对其进行操作。
通常,任务将在 2 到 30 分钟的周期内执行,大约需要 4-5 秒,有时执行时长达 30 秒。
我发现Executors.newSingleThreadedScheduledExecutor(ThreadFactory) 几乎正是我想要的,但如果一个新任务恰好被安排执行而另一个任务已经在执行,它可能会给我带来问题。这是因为 Executor 由单个执行线程备份。
替代方法是使用Executors.newScheduledThreadPool(corePoolSize, ThreadFactory),但这需要我在池中创建多个线程。我想避免在必要之前创建线程,例如,如果我有两个或多个任务由于它们的执行计划冲突而碰巧需要并行执行。
对于上述情况,Executors.newCachedThreadPool(ThreadFactory) 似乎可以执行我想要的操作,但是我无法安排我的任务。我认为缓存和调度执行器的组合最好,但我无法在 Java 中找到类似的东西。
您认为实现上述内容的最佳方式是什么?
【问题讨论】:
-
你可以看到Quartz Scheduler API。
-
空闲线程几乎没有成本。如果你只关心资源,我不会担心。
-
感谢您的回复。这听起来不错,而且我越来越倾向于在池中使用带有几个线程的 ScheduledExecutorService(必须研究最佳池大小)。我主要关心的是避免由于执行程序当前正在执行另一个任务而不得不等待执行的任务。
-
给你一些想法,你的 JVM 可以有大约 20 个线程来运行 HelloWorld。 ;)
-
是的,我知道这听起来可能是因为我正在应用过早的优化,但我将在项目的后期使用相当多的线程,并且我正在努力保持线程数低如果可能的话:)
标签: java multithreading concurrency scheduled-tasks threadpool