Моя проблема заключается в следующем: у меня может быть не более трех одновременных задач. Эти задачи могут обрабатывать от 1 до 100 заданий одновременно. У меня есть много тем, постоянно отправляющих отдельные задания, и я хочу отвечать на них как можно быстрее. Время, затрачиваемое на обработку 100 заданий в одной задаче, равно времени обработки 1 задания в одной задаче. Вакансии появляются через случайные промежутки времени. Потоки, отправляющие задания, должны блокироваться до тех пор, пока задание не будет выполнено или не истечет время ожидания. Быстрое реагирование на потоки, отправляющие задания, является драйвером здесь.
Итак, моя текущая логика такова: если запущено ‹ 3 задач и поступает задание, создайте новое задание для обработки только этого задания самостоятельно. Если запущено 3 задания, поместите задание в очередь и дождитесь завершения другого задания, затем возьмите все задания из очереди (ограничение 100) и создайте задание для их обработки всех.
Я просто не совсем уверен, как лучше всего настроить это на Java. Я создал простую версию семафора, которая отлично работает, но не использует возможность одновременной отправки задания вместе. Как лучше всего расширить это, чтобы полностью удовлетворить мои требования? (нет необходимости использовать семафор, это то, что у меня есть).
private static final Semaphore semaphore = new Semaphore(3);
public static Response doJob(Job job) throws Exception
{
final boolean tryAcquire = this.semaphore.tryAcquire(this.maxWaitTime, TimeUnit.MILLISECONDS);
if (tryAcquire)
{
try
{
return doJobInNewTask(job); // we'd actually like to do all the jobs which are queued up waiting for the semaphore (if there are any)
}
finally
{
this.semaphore.release()
}
}
}
java.util.concurrent
, особенно исполнители и пулы потоков. Вероятно, вам не придется изобретать велосипед. - person Jim Garrison   schedule 15.04.2014