3

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がフリーズしてスタックトレースをロードできないため、この動作の背後にある理由を見つけることができませんでした。

だから私の質問は簡単です

  1. 私のコードは何らかの形で間違っていますか?
  2. CompletableFuture はどのように正常に終了しますか (または、おそらくそうではない場合、junit テスト ケースがどのように合格するか)。

たぶんOSが重要です...私はMacを使用しています。私は以前、独自に開発した約束を持っていましたが、それらはスタックをうまく吹き飛ばしました。

4

1 に答える 1