Есть один фиксированный пул потоков (пусть он будет размером 100), который я хочу использовать для всех задач в моем приложении. Используется для ограничения нагрузки на сервер.
Задача = веб-сканер, который отправляет первое задание в пул потоков.
Это задание может генерировать больше заданий и т. Д.
Одно задание = один запрос ввода-вывода HTTP.
Проблема
Предположим, что есть только одна выполняющаяся задача, которая сгенерировала 10000 заданий.
Эти задания теперь поставлены в очередь пула потоков, и все 100 потоков используются для их выполнения.
Предположим, я сейчас отправляю вторую задачу.
Первое задание второй задачи занимает 10001-е место в очереди.
Оно будет выполнено только после 10000 заданий, поставленных в очередь первой задачей.
Итак, это проблема - я не хочу, чтобы вторая задача так долго ждала, чтобы начать свою первую работу.
Идея
Моя первая идея - создать настраиваемую BlockingQueue и передать ее конструктору пула потоков.
Эта очередь будет содержать несколько блокировок. очереди, по одной для каждой задачи.
Затем ее метод take выберет случайную очередь и возьмет из нее элемент.
Моя проблема с этим в что я не понимаю, как удалить пустую очередь из этого списка, когда ее задача будет выполнена. Это будет означать, что некоторые или все рабочие могут быть заблокированы в методе take, ожидая выполнения заданий от задач, которые были завершены.
Это лучший способ решить эту проблему?
Мне не удалось найти никаких шаблонов для этого ни в книгах, ни в Интернете :(
Спасибо!