Java Gold試験で多くの受験者が躓くのが**「並列処理(Concurrency)」**です。
「Threadクラスは知っているけど、ExecutorServiceやFork/Joinになると急に難しく感じる…」という方も多いのではないでしょうか。
この記事では、試験に必ず出るポイントを、整理しました。
1. 並列処理の全体像:3つの重要ポイント
Java Goldの試験範囲における「並列処理」は、大きく以下の3つに分類されます。
- ExecutorService: スレッドの生成・管理を自動化する仕組み
- Callable & Future: 戻り値を受け取れる並列処理
- Fork/Join Framework: 大きなタスクを分割して並列実行する仕組み
2. 【頻出】ExecutorServiceの使い方
スレッドを直接 new Thread() するのではなく、スレッドプールを使って管理するのが現代のJavaの主流です。
主要なメソッド一覧
| メソッド | 内容 |
execute(Runnable) | タスクを実行する(戻り値なし) |
submit(Callable) | タスクを実行し、Futureを返す(戻り値あり) |
shutdown() | 新規タスクを拒否し、実行中のタスク完了後に終了 |
shutdownNow() | 実行中のタスクを中断して即座に終了 |
shutdown() を呼び出さないと、プログラムが終了せずに待機し続けてしまう問題がよく出題されます!
3. Callable vs Runnable の違い
試験では、この2つのインターフェースの「違い」がコード問題で狙われます。
- Runnable:
run()メソッド。戻り値void。チェック例外を投げられない。 - Callable:
call()メソッド。戻り値あり。チェック例外を投げられる。
4. Fork/Joinフレームワークの仕組み
大量のデータを処理する際に、タスクを再帰的に分割(Fork)し、結果を統合(Join)する仕組みです。
- RecursiveAction: 戻り値がない場合に使用
- RecursiveTask<V>: 戻り値がある場合に使用
5. 本番レベル例題チェック
【第1問】ExecutorServiceの挙動
次のコードを実行した結果はどうなりますか?
Java
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> System.out.print("A"));
Future<?> f = es.submit(() -> System.out.print("B"));
System.out.print(f.get());
es.shutdown();
A. ABnull と表示される B. AB と表示される C. BA と表示される D. コンパイルエラー
正解:A executeは戻り値なし、submitにRunnableを渡すと正常終了時に
f.get()はnullを返します。
【第2問】Callableの特性
次のコードの説明として正しいものはどれですか?
Java
Callable<Integer> task = () -> {
Thread.sleep(1000);
return 10;
};
A. チェック例外(sleep)があるため try-catch が必要 B. CallableはExceptionを投げられるため、このままコンパイルが通る C. submit()はCallableを引数に取れない D. 戻り値がある場合はRunnableを使うべき
正解:B Callableの
call()メソッドはthrows Exceptionが定義されているため、そのまま記述可能です。
【第3問】AtomicIntegerの安全性
AtomicInteger をマルチスレッドで1000回 incrementAndGet() した場合の結果は? A. 常に1000になる B. 1000以下になる可能性がある C. コンパイルエラー D. 実行時例外が発生する
正解:A AtomicクラスはCAS(Compare-And-Swap)という仕組みで、ロックなしでスレッド安全性を保証します。
【第4問】Fork/Joinのクラス
戻り値を返さない並列処理で継承すべきクラスは? A. RecursiveTask B. RecursiveAction C. ForkJoinPool D. ActionTask
正解:B 「Action」は戻り値なし、「Task」は戻り値ありと覚えましょう。
【第5問】CopyOnWriteArrayList
CopyOnWriteArrayList の特徴として正しいものはどれですか? A. 読み取り操作(get)のたびに配列をコピーする B. 書き込み操作のたびに、配列全体のコピーを作成する C. イテレート中に要素を削除すると例外を投げる D. スレッドセーフではない
正解:B 書き込み時にコピーを作ることで、読み取り側がロックなしで高速に動作できるようにしています。
【第6問】shutdownメソッド
shutdown() を呼び出した後の挙動はどれですか? A. 実行中のタスクをすべて中断する B. 新しいタスクの受け入れを停止し、投入済みのタスク完了を待つ C. JVMを即座に終了させる D. すべての Future.get() をキャンセルする
正解:B 「行儀よく終了を待つ」のが
shutdown()です。
【第7問】Fork/Joinのメソッド
サブタスクを非同期に実行キューに追加するメソッドはどれですか? A. fork() B. join() C. split() D. compute()
正解:A
fork()で分割・実行、join()で待機・取得です。
【第8問】CyclicBarrier vs CountDownLatch
CyclicBarrier の最大の特徴はどれですか? A. 一度使うと破棄される B. 再利用(リセット)が可能である C. 戻り値を返すことができる D. シングルスレッド専用である
正解:B 「Cyclic(循環)」という名前の通り、繰り返し利用できるのが特徴です。
【第9問】ConcurrentHashMap
ConcurrentHashMap がスレッド安全性を確保しつつ高速な理由はどれですか? A. Map全体を一つのロックで保護しているから B. ハッシュバケット(セグメント)ごとに細分化してロックするから C. すべての値を不変オブジェクトとして扱うから D. 読み取り専用のMapだから
正解:B 必要な部分だけをロックするため、複数のスレッドからの同時アクセスに強い設計です。
【第10問】Future.get()
Future.get() メソッドを実行した際のスレッドの状態は? A. タスクが完了するまでブロック(待機)される B. タスクの完了を待たずに次の行へ進む C. タスクが未完了なら例外を投げる D. スレッドが終了(Terminate)する
正解:A
get()は結果が確定するまで呼び出し元のスレッドをブロックします。
第5問:Concurrentコレクション
CopyOnWriteArrayList に関する記述として、正しいものを選びなさい。
A. 要素を追加するたびに、配列全体のコピーを作成する。
B. 読み取り操作(get)を行う際もロックがかかるため、低速である。
C. 複数のスレッドから同時に書き込むと ConcurrentModificationException が発生する。
D. ArrayList を Collections.synchronizedList() でラップしたものと同じ挙動である。
正解と解説を見る
正解:B 【解説】 RecursiveAction: 戻り値 なし (Action = 動作のみ) RecursiveTask: 戻り値 あり (Task = 成果物を出す) 名前のイメージで覚えると試験中に迷わなくなります。まとめ:試験直前のチェックリスト
- [ ]
submit()の戻り値はFuture型か? - [ ]
Callableは例外をスローできるか? - [ ]
CopyOnWriteArrayListはスレッドセーフか? - [ ]
CyclicBarrierとCountDownLatchの違いは明確か?


コメント