Скажем, у меня есть очередь, полная задач, которые мне нужно отправить в службу исполнителя. Я хочу, чтобы они обрабатывались по одному. Самый простой способ, который я могу придумать, это:
- Взять задание из очереди
- Отправить его исполнителю
- Позвоните .get на возвращенное будущее и заблокируйте, пока результат не будет доступен
- Возьми еще одно задание из очереди ...
Тем не менее, я пытаюсь избежать блокировки полностью. Если у меня будет 10 000 таких очередей, для которых нужно обрабатывать свои задачи по одной, я исчерпаю пространство стека, потому что большинство из них будут удерживать заблокированные потоки.
То, что я хотел бы, это представить задачу и предоставить обратный вызов, который вызывается, когда задача завершена. Я буду использовать это уведомление об обратном вызове в качестве флага для отправки следующего задания. (Functional Java и Jetlang, очевидно, используют такие неблокирующие алгоритмы, но я не могу понять их код)
Как я могу сделать это, используя java.util.concurrent JDK, если не считать написания моей собственной службы исполнителя?
(очередь, которая кормит меня этими задачами, может сама блокироваться, но это проблема, которая будет решена позже)