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