首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中安排周期性任务,避免在必要时创建新线程(如CachedThreadPool)

在Java中安排周期性任务,避免在必要时创建新线程(如CachedThreadPool)
EN

Stack Overflow用户
提问于 2012-10-04 16:13:32
回答 2查看 1.7K关注 0票数 7

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

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

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

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

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

在上面的例子中,Executors.newCachedThreadPool(ThreadFactory)似乎做了我想做的事情,但是我不能安排我的任务。我认为缓存和调度执行程序的组合是最好的,但我在Java中找不到这样的东西。

你认为实现上述目标的最佳方式是什么?

EN

回答 2

Stack Overflow用户

发布于 2012-10-04 16:22:21

不是ScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int)

代码语言:javascript
复制
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(0);

你需要什么?0corePoolSize

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

票数 1
EN

Stack Overflow用户

发布于 2012-10-04 17:23:14

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

所以你不能改变ScheduledThreadPoolExecutor的实现来这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12723001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档