Disons que j'ai une file d'attente pleine de tâches que je dois soumettre à un service exécuteur. Je veux qu'elles soient traitées une par une. La méthode la plus simple à laquelle je pense est la suivante :
- Prendre une tâche dans la file d'attente
- Soumettez-le à l'exécuteur testamentaire
- Appeler .get sur le Future retourné et bloquer jusqu'à ce qu'un résultat soit disponible.
- Prendre une autre tâche dans la file d'attente...
Cependant, j'essaie d'éviter complètement le blocage. Si j'ai 10 000 files d'attente de ce type, qui ont besoin que leurs tâches soient traitées une par une, je manquerai d'espace sur la pile parce que la plupart d'entre elles s'accrocheront à des threads bloqués.
Ce que je voudrais, c'est soumettre une tâche et fournir un rappel qui est appelé lorsque la tâche est terminée. Je vais utiliser cette notification de rappel comme un drapeau pour envoyer la tâche suivante. (functionaljava et jetlang utilisent apparemment de tels algorithmes non bloquants, mais je n'arrive pas à comprendre leur code)
Comment puis-je le faire en utilisant java.util.concurrent du JDK, sans écrire mon propre service d'exécution ?
(la file d'attente qui m'alimente en tâches peut elle-même se bloquer, mais c'est un problème qui sera abordé plus tard).