使用 CompletableFuture 故意破坏堆栈不会产生堆栈溢出?
Blowing the stack on purpose with CompletableFuture yielded no stack overflow?
我试图查看 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;
}
我尝试在 eclipse 中调试大约 1455 次,但 eclipse 冻结并且无法加载堆栈跟踪,所以我找不到此行为背后的原因。
所以我的问题很简单
- 我的代码有什么不正确的地方吗?
- CompletableFuture 如何成功退出(或者在这种情况下我的 junit 测试用例如何通过)。
也许 OS 很重要...我在 mac 上。我以前有自己的本土承诺,但这些承诺都成功了。
thenAccept
需要一个Consumer
和returns一个CompletableFuture<Void>
。如果消费者 returns 正常无一例外,则 void future 以 null 完成。如果消费者抛出异常,则未来将异常完成并出现该异常。
如果你想捕获 WhosebugException
你需要从返回的未来中获取它。有很多方法可以做到这一点。例如:
future.thenAccept(p -> recurse(p+1)).join();
或
future.thenAccept(p -> recurse(p+1))
.exceptionally(e -> {
e.printStackTrace();
return null;
});
我试图查看 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;
}
我尝试在 eclipse 中调试大约 1455 次,但 eclipse 冻结并且无法加载堆栈跟踪,所以我找不到此行为背后的原因。
所以我的问题很简单
- 我的代码有什么不正确的地方吗?
- CompletableFuture 如何成功退出(或者在这种情况下我的 junit 测试用例如何通过)。
也许 OS 很重要...我在 mac 上。我以前有自己的本土承诺,但这些承诺都成功了。
thenAccept
需要一个Consumer
和returns一个CompletableFuture<Void>
。如果消费者 returns 正常无一例外,则 void future 以 null 完成。如果消费者抛出异常,则未来将异常完成并出现该异常。
如果你想捕获 WhosebugException
你需要从返回的未来中获取它。有很多方法可以做到这一点。例如:
future.thenAccept(p -> recurse(p+1)).join();
或
future.thenAccept(p -> recurse(p+1))
.exceptionally(e -> {
e.printStackTrace();
return null;
});