私は私が持っているこれまでのところCompletableFuture
とStream
を使用して、同時にいくつかのデータ量を処理しようとしている:Javaの8 CompletableFuture、ストリームとタイムアウト
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;
};
}
と出力罰金です:
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!
しかし、今私はそのジョブにタイムアウトを追加したいと思います。 1秒後にキャンセルする必要があります。 nullまたはその他の値をcollect
リストに返します。 (私は原因を示す値を好むだろう)。
どうすれば実現できますか?
ありがとうございました。
を導入しましたcompleteOnTimeout方法を、使用することができます(http ://download.java.net/java/jdk9/docs/api/java/util/concurrent/CompletableFuture.html#completeOnTimeout-T-long-java.util.concurrent.TimeUnit-) – eee
これまでのところ(おそらくしばらくの間)私の会社はjava 8と私はそれを使用することはできませんので、私は使用できません:) – user2377971