Exemple de code suivant J'injecte un biconsumer
qui dort pour 100 millis comme une action d'achèvement d'un ensemble d'avenir à compléter. J'ai utilisé la méthode whenCompleteAsync
en donnant un executorService
à utiliser. executorService
est un ThreadPoolExecutor
avec la taille de la piscine de base 5, la taille max 5 et la longueur de la file d'attente de 1.Comment puis-je capturer la exception RejectedExecutionException levée dans l'invocation de WhenCompleteAsync d'un CompletableFuture?
public class CompleteTest {
public static void main(String[] args) {
ExecutorService executorService = new ThreadPoolExecutor(5, 5, 10,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(1));
ArrayList<CompletableFuture<String>> list = new ArrayList<>();
for (int i = 0; i <100; i++) {
CompletableFuture<String> stringCompletableFuture = new CompletableFuture<>();
stringCompletableFuture.whenCompleteAsync((e, a) -> {
System.out.println("Complete " + e);
try {
Thread.sleep(100);
} catch (InterruptedException e1) {e1.printStackTrace();}
}, executorService);
list.add(stringCompletableFuture);
}
for (int i = 0; i < list.size(); i++) {
list.get(i).complete(i + "");
}
}
}
Quand je courais le code, même si je terminé 100 à terme seulement 6 sorties seront imprimés. C'est 5 threads de base et 1 file d'attente. Qu'arrive-t-il au reste? Si d'autres exécutables ne peuvent pas être soumis au service d'exécution en raison de la file d'attente déjà pleine, ne devrait pas y avoir une exception.
OutPut
Complete 0
Complete 1
Complete 2
Complete 3
Complete 4
Complete 5