На моем сервере запущено много (около 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
на самом деле не упоминают об этом. Обновление: Я проверял это, предположение верно.
И в любом случае, как мне правильно справиться с такой ситуацией?