我必须在一天中的不同时间异步启动10个任务,直到第二天的某个小时。我越接近第二天的时间,我就越需要重复这10个任务。
我的问题是,我该如何管理?我应该使用哪些执行者?管理内存的最佳方法是什么?
我想过使用一个Executors.newScheduledThreadPool,它可以在不同的时间用10个任务启动一个线程池进程。问题要求我启动一组新任务,即使前一组任务尚未完成(因此每次都可能触发一个新的线程池)。
我也在考虑使用某种流程注册表来管理已启动的不同流程。当一个进程不再使用时,注册表就可以阻止它。
每次完成任务时,我都会想到冲洗runnables并停止线程池。这整体上是一个很好的解决方案吗?
可能出现的问题是让内存充满了线程池。也许在线程池上加上时间限制?
答案 0 :(得分:1)
我想,你需要一个调度线程在普通的非调度池中,另一个池用于worker,如下所示:
ExecutorService ex = Executors.newFixedThreadPool(1);
final ExecutorService workersPool = Executors.newCachedThreadPool();
ex.submit(new Runnable() {
public void run() {
try {
do {
// determine if it's time to start workers
if (timeToStartWorkers()) {
workersPool.submit(new Worker(...));
workersPool.submit(new Worker(...));
...
}
// sleep till next time
Thread.sleep(timeTillNextCheck);
}
} catch (InterruptedException e) {
// handle exception
}
}
});
无需重新创建线程池。