Java 使用CompletableFuture故意吹扫堆栈不会导致堆栈溢出?
我试图查看上的行为故意导致CompletableFuture的堆栈溢出,但却发现它导致了成功,我的递归循环刚刚停止并退出,junit测试通过。这真的不是我想要的行为。我想要一个快速失败的行为,这样我就知道如何修复我的代码Java 使用CompletableFuture故意吹扫堆栈不会导致堆栈溢出?,java,completable-future,Java,Completable Future,我试图查看上的行为故意导致CompletableFuture的堆栈溢出,但却发现它导致了成功,我的递归循环刚刚停止并退出,junit测试通过。这真的不是我想要的行为。我想要一个快速失败的行为,这样我就知道如何修复我的代码 @Test public void testBlowTheStack() throws InterruptedException { recurse(0); System.out.println("done"); Thread.sleep(5000);
@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;
}
@测试
public void testBlowTheStack()抛出InterruptedException{
递归(0);
系统输出打印项次(“完成”);
睡眠(5000);
}
私有void递归(int计数器){
CompletableFuture=写入数据(计数器);
然后接受(p->recurse(p+1));
}
专用CompletableFuture writeData(整型计数器){
System.out.println(“计数器=”+计数器);
如果(计数器==1455){
系统输出打印项次(“标记”);
}
CompletableFuture=新的CompletableFuture();
未来。完成(计数器);
回归未来;
}
我试图在eclipse中调试计数1455左右的代码,但是eclipse冻结并且无法加载堆栈跟踪,因此我无法找到这种行为背后的原因
所以我的问题很简单
也许操作系统很重要…我在mac上。我以前有自己的自制承诺,这些承诺成功地打破了僵局。
然后accept
接受消费者
并返回一个可完成的未来
。如果消费者无一例外地正常返回,则无效期货将以null完成。如果消费者抛出异常,则未来将异常完成该异常
如果您想捕获StackOverflowException
,您需要从返回的将来获取它。有很多方法可以做到这一点。例如:
future.thenAccept(p -> recurse(p+1)).join();
或
啊,当然……这是有道理的,因为异常会被捕获……酷,这比我预期的要多。嗯,我必须测试stackoverflow,然后调用ExceptionOnly方法(并在那里强制堆栈溢出)……我想知道这是如何处理的。我还没有尝试过,但我对JavaAPI文档的解释是,第二个异常将丢失,未来将与原始异常一起完成。换句话说,如果异常地抛出一个异常,那就是noop。
future.thenAccept(p -> recurse(p+1))
.exceptionally(e -> {
e.printStackTrace();
return null;
});