我有许多任务,我希望对大多数任务以不同的速率定期执行。不过,某些任务可能会被调度为同时执行。此外,一个任务可能需要在另一个任务当前正在执行时开始执行。
我还想通过为每个任务设置一个对象来自定义每个任务,任务在执行时将在该对象上运行。
通常,任务将在2到30分钟内执行,大约需要4-5秒,有时执行时长达30秒。
我发现Executors.newSingleThreadedScheduledExecutor(ThreadFactory)几乎就是我想要的,只是如果一个新任务被安排执行,而另一个任务已经在执行,它可能会给我带来问题。这是由于Executor由单个执行线程备份的事实。
另一种方法是使用Executors.newScheduledThreadPool(corePoolSize, ThreadFactory),但这需要我在一个池中创建多个线程。我希望避免创建线程,直到有必要,例如,如果我有两个或更多的任务碰巧需要并行执行,因为它们的执行计划冲突。
在上面的例子中,Executors.newCachedThreadPool(ThreadFactory)似乎做了我想做的事情,但是我不能安排我的任务。我认为缓存和调度执行程序的组合是最好的,但我在Java中找不到这样的东西。
你认为实现上述目标的最佳方式是什么?
发布于 2012-10-04 16:22:21
不是ScheduledThreadPoolExecutor.ScheduledThreadPoolExecutor(int)吗
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(0);你需要什么?0是corePoolSize
corePoolSize-保留在池中的线程数,即使它们是空闲的,除非将allowCoreThreadTimeOut设置为
发布于 2012-10-04 17:23:14
我猜ScheduledExecutor无法做到这一点,因为它使用DelayedWorkQueue,而as newCachedThreadPool使用ThreadPoolExecutor SynchronousQueue作为工作队列。
所以你不能改变ScheduledThreadPoolExecutor的实现来这样做。
https://stackoverflow.com/questions/12723001
复制相似问题