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){}のブロックで囲っただけなのにどうしてこうなった。

コメントで解説求む。