【问题标题】:How to schedule a group of threads (tasks) at variable times?如何在可变时间调度一组线程(任务)?
【发布时间】:2011-10-21 15:37:18
【问题描述】:

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

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

我想过使用 Executors.newScheduledThreadPool 可以在可变时间启动一个包含 10 个任务的线程池进程。这个问题需要我启动一组新的任务,即使前一组任务还没有完成(所以可能每次都会触发一个新的线程池)。

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

每次任务完成时,我都会考虑刷新可运行对象,并停止线程池。这总体上是一个好的解决方案吗?

可能出现的问题是线程池使内存饱和。也许对线程池设置时间限制?

【问题讨论】:

    标签: java threadpool scheduled-tasks


    【解决方案1】:

    我猜,你需要一个普通的非调度池中的调度线程和另一个用于工人的池,如下所示:

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

    无需重新创建线程池。

    【讨论】:

    • 感谢维克多的回答。我正计划使用方法 invokeall 来获取结果,我想我仍然可以使用它。我下周试试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2021-10-18
    相关资源
    最近更新 更多