Callable<T>の闇
java.util.concurrent.ExecutorServiceクラスには<T> Future<T> submit(Callable<T> task);メソッドとFuture<?> submit(Runnable task);メソッドがあるが、これらのメソッドをラムダ式と組み合わせると奇怪な挙動となる・・・。
// コンパイルエラーとならない例
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> {
while (true) {
new FileInputStream("aaa");
}
});
}// コンパイルエラーとなる例
public static void main(String[] args) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(() -> {
new FileInputStream("aaa"); // 処理されない例外の型 FileNotFoundException
});
}どうやらラムダ式を使っているのでわからなかったが、上の例は引数がCallable<T>のメソッドに、下の例は引数がRunnableのメソッドを呼び出すことになっている模様。while(true){}のブロックで囲っただけなのにどうしてこうなった。
コメントで解説求む。