在我的服务器中,我有许多(大约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
的文档并没有真正提到它。
无论哪种方式,我怎样才能妥善处理这种情况?