Powiedzmy, że mam kolejkę pełną zadań, które muszę przesłać do usługi wykonawczej. Chcę, aby były przetwarzane pojedynczo. Najprościej przychodzi mi do głowy:
- Weź zadanie z kolejki
- Prześlij go do wykonawcy
- Wywołaj .get na zwróconym Future i blokuj, aż wynik będzie dostępny
- Weź kolejne zadanie z kolejki ...
Jednak staram się całkowicie uniknąć blokowania. Jeśli mam 10000 takich kolejek, które wymagają przetwarzania ich zadań pojedynczo, zabraknie mi miejsca na stosie, ponieważ większość z nich będzie trzymać się zablokowanych wątków.
Chciałbym przesłać zadanie i zapewnić oddzwonienie, które zostanie wywołane po zakończeniu zadania. Użyję tego powiadomienia zwrotnego jako flagi do wysłania następnego zadania. (Functionjava i jetlang najwyraźniej używają takich nieblokujących algorytmów, ale nie mogę zrozumieć ich kodu)
Jak mogę to zrobić za pomocą java.util.concurrent JDK, poza napisaniem własnej usługi wykonawczej?
(kolejka, która dostarcza mi te zadania, może sama się blokować, ale jest to problem, który należy rozwiązać później)