Как запланировать сотни крошечных задач с большой задержкой в ​​ScheduledThreadPoolExecutor? - PullRequest
0 голосов
/ 10 ноября 2011

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

И в любом случае, как мне правильно справиться с такой ситуацией?

...