AI作成・独立検証済(有資格者監修なし)1Z0-829 対応
並行処理(ExecutorService shutdown 後の submit)難易度 高無料

次のコードの実行結果として正しいものを選べ。

 1  import java.util.concurrent.*;
 2  public class Q9 {
 3      public static void main(String[] a) throws Exception {
 4          ExecutorService ex = Executors.newSingleThreadExecutor();
 5          Future<Integer> f1 = ex.submit(() -> 6 * 7);
 6          System.out.println(f1.get());
 7          ex.shutdown();
 8          Future<Integer> f2 = ex.submit(() -> 1);   // 行A
 9          System.out.println(f2.get());
10      }
11  }
  1. A42 を出力後、行A で RejectedExecutionException がスローされる
  2. B42 改行 1(shutdown 後も submit は受け付けられる)
  3. Cコンパイルエラー(submitRejectedExecutionException を処理していない)
  4. D42 を出力後、行A の submit は静かに無視され f2.get()null を返す
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・独立検証済

解説

ExecutorService.submit(Callable) はタスクを投入し、結果を Future で受け取る。f1.get() は完了を待って 42 を返す(ここまでは正常)。

問題は7行目の shutdown() 後の8行目。shutdown() は「新規タスクの受け付けを停止」する(既存タスクは完了させるが、新たな submit は拒否する)。 既定の拒否ポリシー(AbortPolicy)により、停止済みエグゼキュータへの submit実行時に RejectedExecutionException(非検査例外)をスローする。

よって6行目で 42 が出力された後、行A で RejectedExecutionException が投げられ、9行目には到達しない。 RejectedExecutionExceptionRuntimeException のサブクラスなので、submit のシグネチャに throws は不要(コンパイルは通る)。

各誤答が違う理由
  • Bshutdown() 後は新規タスクを拒否する。行A の submit は成功せず例外になる。
  • CRejectedExecutionException非検査例外RuntimeException 系)なので throwscatch は不要。コンパイルは通る。
  • D拒否は「無視」ではない。既定ポリシー(AbortPolicy)は例外を投げるので f2 の取得には到達しない。
ひっかけ: shutdown() は「今すぐ全部止める」ではなく「新規受付を止め、投入済みは走らせる」。停止後の submit は静かに無視されるのではなく RejectedExecutionException を投げる。即時停止は shutdownNow()(未実行タスクを返す)。
実機確認の答え合わせ
出力と例外:
42
Exception in thread "main" java.util.concurrent.RejectedExecutionException: ...
(行A の submit で送出。行9 には到達しない)
AIが作成し、独立した検証を経た解説です(有資格者による監修は経ていません)
この分野をもっと解いて、得点源に
並行処理 を含む問題を分野別に演習できます。
演習する →