「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Java スレッド プール: スレッドを効率的に管理する方法

Java スレッド プール: スレッドを効率的に管理する方法

2024 年 11 月 9 日に公開
ブラウズ:443

Java Thread Pool: How to Efficiently Manage Threads

1. Java のスレッド プールの概要

1.1 スレッドプールとは何ですか?

スレッド プールは、タスクの実行に使用できる、事前にインスタンス化された再利用可能なスレッドのグループです。タスクが送信されると、そのタスクはプール内のアイドル状態のスレッドに割り当てられます。すべてのスレッドがビジーの場合、タスクはスレッドが使用可能になるまでキュー内で待機します。

1.2 スレッド プールを使用する理由

スレッド プールにはいくつかの利点があります:

  • リソース管理 : スレッド プールはスレッドを再利用することで、スレッドの作成と破棄のオーバーヘッドを削減します。
  • パフォーマンス : スレッド プールは固定数のスレッドを管理し、過度のスレッド作成によるシステムの負荷を防ぎます。
  • スケーラビリティ : スレッド プールは、すべてのスレッドがビジー状態のときにタスクをキューに入れることで大量のタスクを処理でき、タスクが効率的に処理されるようにします。

1.3 スレッド プールはどのように機能しますか?

タスクをスレッド プールに送信すると、次の手順が実行されます:

  • タスクはキューに追加されます。
  • アイドル状態のスレッドが利用可能な場合、そのスレッドはタスクを取得して実行します。
  • 使用可能なアイドル スレッドがない場合、タスクはスレッドが空くまでキュー内で待機します。

1.4 スレッド プールをいつ使用するか?

スレッド プールは、Web サーバーでのリクエストの処理やジョブのバッチの処理など、多数の短期間のタスクを管理する必要があるシナリオで特に役立ちます。

2. Java でのスレッド プールの実装

Java は、java.util.concurrent パッケージでいくつかの組み込みスレッド プール実装を提供します。最も一般的に使用されるのは ExecutorService です。 Java でスレッド プールを作成して使用する方法を見てみましょう。

2.1 スレッドプールの作成

Java でスレッド プールを作成するには、Executors クラスを使用できます。このクラスは、さまざまなタイプのスレッド プールを作成するためのさまざまなメソッドを提供します。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // Create a fixed thread pool with 5 threads
        ExecutorService executorService = Executors.newFixedThreadPool(5);

        for (int i = 0; i 



2.2 スレッドプールの種類

Java は、さまざまなシナリオ向けに設計されたいくつかのタイプのスレッド プールを提供します。

固定スレッドプール : 固定数のスレッドを作成します。すべてのスレッドがビジー状態の場合、タスクはキューに入れられます。

ExecutorService fixedPool = Executors.newFixedThreadPool(10);

キャッシュされたスレッド プール : 必要に応じて新しいスレッドを作成しますが、利用可能な場合は以前に構築されたスレッドを再利用します。多くの短期間のタスクの実行に適しています。

ExecutorService cachedPool = Executors.newCachedThreadPool();

Single Thread Executor: タスクを順番に実行する単一のワーカー スレッドを作成します。

ExecutorService singlePool = Executors.newSingleThreadExecutor();

スケジュールされたスレッド プール: 指定された遅延後または定期的にコマンドを実行するようにスケジュールできるスレッド プールを作成します。

ScheduledExecutorService scheduledPool = Executors.newScheduledThreadPool(5);

2.3 例: 固定スレッド プールのデモ

この例では、5 つのスレッドを持つ固定スレッド プールが作成されます。 10 個のタスクをプールに送信します。プールは、これらのタスクを使用可能なスレッドに割り当てます。すべてのスレッドがビジーの場合、タスクはキュー内で待機します。

期待される出力:

Task 0 is being executed by pool-1-thread-1
Task 1 is being executed by pool-1-thread-2
Task 2 is being executed by pool-1-thread-3
Task 3 is being executed by pool-1-thread-4
Task 4 is being executed by pool-1-thread-5
Task 5 is being executed by pool-1-thread-1
Task 6 is being executed by pool-1-thread-2
Task 7 is being executed by pool-1-thread-3
Task 8 is being executed by pool-1-thread-4
Task 9 is being executed by pool-1-thread-5

2.4 スレッド プールを使用するためのベスト プラクティス

  • 適切なプール サイズを選択してください : タスクの性質に基づいてプール サイズを選択します。 CPU バウンドのタスクは、利用可能なプロセッサの数と同じプール サイズの恩恵を受ける可能性がありますが、I/O バウンドのタスクはより大きなプールを必要とする場合があります。
  • 正常なシャットダウン : 適切なリソースのクリーンアップを可能にするために、常に shutdown() または shutdownNow() を使用してスレッド プールをシャットダウンします。
  • ブロック操作を避ける : スレッドの枯渇を防ぐために、タスク内のブロック操作を避けます
  • 監視と調整 : スレッド プールのパフォーマンスを監視し、アプリケーション要件を満たすために必要に応じてプール サイズまたは構成を調整します。

3. 結論

Java のスレッド プールは、タスクを効率的に管理および実行するための堅牢な方法を提供します。固定されたスレッドのセットを再利用することにより、オーバーヘッドが削減され、マルチスレッド アプリケーションのパフォーマンスが向上します。 Web リクエストの処理、バックグラウンド ジョブの実行、並列計算の実行のいずれの場合でも、スレッド プールは Java 同時実行ツールキットの重要なツールです。

ご質問がありますか?以下のコメント欄に書き込んでください。

投稿の詳細はで読む: Java スレッド プール: スレッドを効率的に管理する方法

リリースステートメント この記事は、https://dev.to/anh_trntun_4732cf3d299/java-thread-pool-how-to-efictively-manage-threads-3j36に再現されています。1侵害がある場合は、[email protected]に連絡してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3