Future<T>.get() 在 runnable 抛出异常时卡住了——而 运行 在单独的执行程序服务上?
Future<T>.get() stuck when the runnable throws exception--while running on separate executor service?
此处重现:
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!" 和异常堆栈跟踪,然后程序永远挂起。
下面的更改可以解决这个问题,但是知道上面的代码执行挂起的原因吗?
使用公共线程池不会挂起:
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
管理的非守护线程。
此处重现:
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!" 和异常堆栈跟踪,然后程序永远挂起。
下面的更改可以解决这个问题,但是知道上面的代码执行挂起的原因吗?
使用公共线程池不会挂起:
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
管理的非守护线程。