JavaのExecutorとExecutorServiceの違いを徹底解説
JavaのExecutorとExecutorServiceの違いとは?
ExecutorとExecutorServiceは、どちらもJava 5で導入されたExecutorフレームワークに含まれるインターフェースです。
Javaにおいてスレッドの生成は非常にコストの高い処理です。そのため、タスクごとに新しいスレッドを作成するのではなく、既存のスレッドを再利用することが推奨されます。この課題を解決してくれるのがExecutorフレームワークです。
Executorフレームワークはスレッドプールを使ってタスクを並列実行し、応答時間の短縮とリソース利用の最適化を実現します。標準APIには以下の4種類のスレッドプールが用意されています。
- Fixed Thread Pool:固定サイズのスレッドプール
- Cached Thread Pool:必要に応じてスレッドを生成・再利用するプール
- Scheduled Thread Pool:遅延実行や定期実行に対応したプール
- Single Thread Executor:単一スレッドで順次実行するエグゼキュータ
ExecutorとExecutorServiceの比較表
| 番号 | 項目 | Executor | ExecutorService |
|---|---|---|---|
| 1 | 基本 | 親インターフェース | Executorインターフェースを拡張したインターフェース |
| 2 | メソッド | execute()メソッドを持つ | submit()メソッドを持つ |
| 3 | 戻り値 | 何も返さない(void) | Futureオブジェクトを返す |
| 4 | 引数の型 | Runnableオブジェクトのみ受け付ける | RunnableとCallableの両方を受け付ける |
ExecutorServiceの使用例
public class Main {
public static void main(String args[]) {
ExecutorService services = Executors.newSingleThreadExecutor();
Future<?> future = services.submit(new Task());
}
}
public class Task implements Runnable {
@Override
public void run() {
System.out.println("In Run");
}
}
submit()メソッドはFutureオブジェクトを返すため、タスクの完了状態や実行結果を後から取得できます。また、Callableを受け付けられるので、戻り値のあるタスクも扱えます。
Executorの使用例
public class Main {
public static void main(String args[]) {
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Task());
}
}
public class Task implements Runnable {
@Override
public void run() {
System.out.println("In Run");
}
}
使い分けのポイント
単純にタスクを実行するだけで結果が不要な場合は、Executorのexecute()で十分です。一方、タスクの結果取得やキャンセル、タイムアウト制御、shutdown()による適切な終了処理が必要なケースでは、機能が豊富なExecutorServiceを選択しましょう。実際の開発では、後始末まで管理できるExecutorServiceを使うことが一般的です。
-
JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説
はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って