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){}
のブロックで囲っただけなのにどうしてこうなった。
コメントで解説求む。