スレッド プールは、その名前が示すように、再利用できるスレッドのコレクションです。これらのスレッドは以前に作成されており、利用可能なスレッドのコレクションがすでにある場合にオーバーヘッドの解決策を提供する機能も備えています。これらは再利用でき、スレッド サイクルとスレッドのタスク完了の待機の問題を解決できます。リクエストが到着するたびにスレッドがすでに存在しているため、スレッド作成のプロセスが削除され、その結果、時間が節約され、処理が高速化されます。このトピックでは、Java スレッド プールについて学習します。
無料ソフトウェア開発コースを始めましょう
Web 開発、プログラミング言語、ソフトウェア テスト、その他
スレッド プール内のすべてのスレッドは、java.util.concurrent のメソッドを実装します。 Java スレッド プールによって管理されるスレッド プールがあります。このプールを確認する最も簡単な方法は、使用するスレッドが増えるほど、各スレッドが実際の作業に費やす時間が短くなるということです。これは、マルチスレッドを使用できるアプリケーションでリソースを節約するのに役立つ方法です。この Java スレッドによってプール用に維持されるキューがあります。
ワーカー スレッドは、タスクが割り当てられて実行されるのを待ち続けます。スレッド プールを作成するには、Java で ThreadPoolExecutor が使用されます。実行可能なスレッドのコレクションは、Java スレッド プール内のスレッドを管理します。この後、ワーカー スレッドが表示され、キューが形成されます。スレッド プールはこれらのキューを監視します。
java.util.concurrent.Executor は、スレッドの管理に必要なファクトリとサポート メソッドを支援します。このクラスは、スレッド プールの作成も担当します。さて、次の質問は、この執行者とは何ですか?ということかもしれません。 Executor は、ユーティリティ クラスの一部であるさまざまなクラスを提供します。
スレッド プールの技術的な動作は、並行して実行できるタスクに分割された同時実行コードを格納するプールのように考えることができます。次に、それらは実行のためにプールに送信されます。タスクのサブミッター、エグゼキューター サービス、タスク キュー、そして最後にスレッド プールがあります。このパターンは、アプリケーション内に存在するスレッドの数を制御するのに役立ちます。ライフサイクルを決定し、タスクをスケジュールし、タスクを作業キューに入れ続けます。
Executorshelper クラスには、事前に構成されたスレッド プール インスタンスを持つさまざまなメソッドがあります。 Executor インターフェイスと ExecutorService インターフェイスは、プール内のさまざまな実装を操作するのに役立ちます。コードは、実際の実装前に分離された形式にする必要があります。使用される別のインターフェイスがあります。それは ThreadPoolExecutor です。これは、多くのパラメーターを指定できる拡張可能なスレッド プールの実装であり、微調整が可能になります。使用できるパラメータには、コア プール サイズ、最大プール サイズ、およびキープアライブ時間が含まれます。キューは最大プール サイズまでしか拡張できません。
プールを作成して、それがどのように機能するかを見てみましょう。
コード:
import java.util.Date; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // The Job class will be executed in this case class Job implements Runnable { private String name; public Job(String s) { name = s; } // The task name will be populated first for the ones which were not running already, and the thread will sleep for 2s //This entire method will be repeated 6 times public void run() { try { for (int i = 0; i<=5; i++) { if (i==0) { Date d = new Date(); System.out.println("We are in " + " task name - "+ name); //prints the task name every time the new task is started } else { System.out.println("The job "+ name +" is already running "); // prints the job name which is already running } Thread.sleep(2000); // The thread is in sleep mode for 2 secs } System.out.println(name+" job is completes"); } catch(InterruptedException e) { e.printStackTrace(); } } } public class Test { // Here we define the maximum threads we have static final int MAX_Threads= 5; public static void main(String[] args) { Runnable run1 = new Job("task 1"); Runnable run2 = new Job("task 2"); Runnable run3 = new Job("task 3"); //A new thread pool is created with maximum number of threads ExecutorService newpool = Executors.newFixedThreadPool(MAX_Threads); newpool.execute(run1); newpool.execute(run2); newpool.execute(run3); newpool.shutdown(); } }
上記のコードは、スレッドの作成からシャットダウンされるまでの各ステップをカバーしています。最大スレッド制限が固定および作成されています。これが完了すると、1 つずつ実行される 3 つのジョブが作成されます。各ジョブには 2 秒間のスリープ時間も割り当てられています。スレッド プールが作成され、すべてのジョブが同時に動作するため、このプロセス全体が 6 回実行されることがわかります。 if ステートメントがスレッド プールで実行されると、ジョブがすでに実行されているかどうかが確認されます。ジョブの実行が開始されていない場合は、if ブロックが実行されます。すでに実行中の場合は、else ブロックが実行されます。ジョブ名が表示され、すでに実行中であることが示されます。スレッド プールが作成され、3 つのジョブがすべて実行されます。ジョブが実行されたら、作成したスレッド プールをシャットダウンします。
以下は、指定されたプログラムの出力です。
出力:
すべてのタスクが完了するまで実行されます。
Java のスレッド プールにはいくつかの利点があります。いくつか挙げると、主な利点は以下のとおりです:
ただし、スレッド プールにはいくつかの欠点もあります。以下はデメリットです:
その結果、スレッド プールは、手元にある複数のタスクを処理する効率的な方法となります。 Java は、スレッドを再利用し、既存のリソースを利用する機能を提供します。
以上がJavaスレッドプールの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。