如何在可变时间安排一组线程(任务)?

时间:2011-10-21 15:37:19

标签: java threadpool scheduled-tasks

我必须在一天中的不同时间异步启动10个任务,直到第二天的某个小时。我越接近第二天的时间,我就越需要重复这10个任务。

我的问题是,我该如何管理?我应该使用哪些执行者?管理内存的最佳方法是什么?

我想过使用一个Executors.newScheduledThreadPool,它可以在不同的时间用10个任务启动一个线程池进程。问题要求我启动一组新任务,即使前一组任务尚未完成(因此每次都可能触发一个新的线程池)。

我也在考虑使用某种流程注册表来管理已启动的不同流程。当一个进程不再使用时,注册表就可以阻止它。

每次完成任务时,我都会想到冲洗runnables并停止线程池。这整体上是一个很好的解决方案吗?

可能出现的问题是让内存充满了线程池。也许在线程池上加上时间限制?

1 个答案:

答案 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
            }
        }
    });

无需重新创建线程池。