gpt4 book ai didi

java - Future.get() 在 runnable 抛出异常时卡住了——在单独的执行程序服务上运行时?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:00:59 24 4
gpt4 key购买 nike

此处复制:

import java.util.concurrent.*;

public class Main {

public static void main(String[] args) throws ExecutionException, InterruptedException {
System.out.println("Hello!");

ExecutorService exec = Executors.newSingleThreadExecutor();

Future<Integer> f = exec.submit(() -> x());

f.get();

System.out.println("f.get() returned");

exec.shutdownNow();

System.out.println("Good bye!");
}

private static Integer x() {
throw new RuntimeException("An unfortunate event");
}
}

输出仅显示“Hello!”和异常堆栈跟踪,然后让程序永远挂起。

下面的更改可以解决这个问题,但是知道上面代码中执行挂起的原因吗?

使用公共(public)线程池不会挂起:

Future<Integer> f = ForkJoinPool.commonPool().submit(() -> x());

围绕 try/catch 的调用可以让应用程序正常退出:

Future<Integer> f = exec.submit(() -> x());

try {
f.get();
} catch (Exception ex) {
ex.printStackTrace();
}

最佳答案

总是很难找到try-finally 及其适当用法的好例子。我认为是这样的。

try {
f.get();
System.out.println("f.get() returned");
} finally {
exec.shutdownNow();
}

f.get(); 抛出的异常未被处理,主线程失败。但是该应用程序仍然包含可由您无法直接访问的 ExecutorService 管理的非守护线程。

关于java - Future<T>.get() 在 runnable 抛出异常时卡住了——在单独的执行程序服务上运行时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53251394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com