Java
 Computer >> コンピューター >  >> プログラミング >> Java

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の比較表

番号項目ExecutorExecutorService
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を使うことが一般的です。

  1. JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

    はじめに:IteratorとEnumerationとはJavaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ) と Enumeration(列挙) の2つです。両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。Enumerati

  2. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って