CompletableFuture で故意にスタック オーバーフローを引き起こした場合の動作を確認しようとしていますが、代わりに成功し、再帰ループが停止して終了し、junit テストに合格したことがわかりました。これは、私が望む動作ではありません。私は自分のコードを修正することを知っているので、フェイルファーストの動作が必要です。
@Test
public void testBlowTheStack() throws InterruptedException {
recurse(0);
System.out.println("done");
Thread.sleep(5000);
}
private void recurse(int counter) {
CompletableFuture<Integer> future = writeData(counter);
future.thenAccept(p -> recurse(p+1));
}
private CompletableFuture<Integer> writeData(int counter) {
System.out.println("counter="+counter);
if(counter == 1455) {
System.out.println("mark");
}
CompletableFuture<Integer> future = new CompletableFuture<Integer>();
future.complete(counter);
return future;
}
カウント1455前後でEclipseでデバッグしようとしましたが、Eclipseがフリーズしてスタックトレースをロードできないため、この動作の背後にある理由を見つけることができませんでした。
だから私の質問は簡単です
- 私のコードは何らかの形で間違っていますか?
- CompletableFuture はどのように正常に終了しますか (または、おそらくそうではない場合、junit テスト ケースがどのように合格するか)。
たぶんOSが重要です...私はMacを使用しています。私は以前、独自に開発した約束を持っていましたが、それらはスタックをうまく吹き飛ばしました。