如何在ScheduledThreadPoolExecutor中安排数百个微小的,长时间延迟的任务?

时间:2011-11-10 16:05:31

标签: java multithreading scheduled-tasks executorservice

在我的服务器中,我有许多(大约50-1000或者其他)游戏正在运行,所有人都希望每20秒执行一次短任务。为了使这项工作有效,我想我会创建一个由所有人共享的执行者:

    ScheduledThreadPoolExecutor t = new ScheduledThreadPoolExecutor(4);
    t.setMaximumPoolSize(32);
    t.setKeepAliveTime(30, TimeUnit.SECONDS);

应该执行的任务很短;它只是将Runnable提交给另一个缓存的线程池:

    t.schedule(
            new Runnable() { @Override public void run() {
                log.info("End of turn for player " + player);
                // the process started here will indirectly schedule this task again
                ThreadPool.execute(...); 
            }},
            turnTime, TimeUnit.MILLISECONDS
    );

但是,大部分任务根本不会执行。这让我怀疑执行者已经满了,尽管任务太短了。

我假设在执行提交任务之前的延迟中,执行程序的线程将不会用于该任务。这个假设是否正确?现在我想起来了,ScheduledThreadPoolExecutor的文档并没有真正提到它。 更新:我测试了这个,假设是正确的。

无论哪种方式,我怎样才能妥善处理这种情况?

0 个答案:

没有答案