je suis en train de traiter une certaine quantité de données en utilisant simultanément CompletableFuture
et Stream
Jusqu'à présent, j'ai:Java 8 CompletableFuture, Stream et Timeouts
public static void main(String[] args) throws InterruptedException, ExecutionException {
System.out.println("start");
List<String> collect = Stream.of("1", "2", "3", "4", "5",
"6", "7")
.map(x -> CompletableFuture.supplyAsync(getStringSupplier(x)))
.collect(Collectors.toList())
.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
System.out.println("stop out!");
}
public static Supplier<String> getStringSupplier(String text) {
return() -> {
System.out.println("start " + text);
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("stop " + text);
return "asd" + text;
};
}
Et la sortie est bien:
start start 1 start 4 start 3 start 2 start 5 start 6 start 7 stop 4 stop 1 stop 5 stop 2 stop 6 stop 3 stop 7 stop out!
Cependant, en ce moment, je veux ajouter un délai d'attente à ce travail. Disons qu'il devrait être annulé après 1 seconde. Et renvoie null ou une autre valeur à la liste collect
. (Je préférerais une valeur indiquant la cause).
Comment puis-je y parvenir?
Merci de votre aide à l'avance.
En Java 9 vous pouvez le faire facilement avec 'CompletableFuture # completeOnTimeout' (http : //download.java.net/java/jdk9/docs/api/java/util/concurrent/CompletableFuture.html#completeOnTimeout-T-long-java.util.concurrent.TimeUnit-) – eee
Jusqu'à présent (et sera probablement pendant un certain temps) ma société fonctionne avec java 8 donc je ne peux pas l'utiliser :) – user2377971