章のスレッドプール
スレッドプールのアイデアの2.1の概要
とき、我々はスレッドを作成するためにスレッドを使用するために行ってきましたので、実装するのは非常に簡単ですが、問題があるでしょう。
もし、多くの同時実行スレッド数、および各スレッドは、それほど頻繁に、仕事が終わって、非常に短い時間で実行されます頻繁にスレッドの作成とスレッドの破壊の時間がかかるため、スレッドが大幅に、システムの効率が低下します作成します。
スレッドが破壊されないタスクを実行した後、つまり、再利用することができますが、他のタスクを実行し続けることができるように方法はありますか?
Javaでは、あなたはできるプールスレッド、このような効果を達成するために。
2.2スレッドプールの概念
- スレッドプール:実際には、スレッドを繰り返し使用することができ、収納容器、複数のスレッドは、多くの場合、繰り返しのスレッドを作成し、あまりにも多くのリソースを消費することなく、スレッドオブジェクトの操作を作成する必要がなくなります。
スレッドプールの操作の多くは、リソースの最適化に関連しているがあるので、私たちはここに持っているそれらを繰り返すことではありません。私たちはどのようにスレッドプールを理解するためのマップを渡します。
3つの利益をもたらすことができる、スレッドプールの使用の合理化:
- リソース消費を削減します。各ワーカースレッドを再利用することができ、スレッドの作成と破棄の数を減らすには、複数のタスクを実行することができます。
- 応答速度を向上させます。ミッションが到着すると、タスクは、スレッドの作成を直ちに実施することが可能になるまで待つ必要がないかもしれません。
- スレッドには、管理性を向上させます。サーバが自分自身を燃やしながら、システムの容量に応じて、ためのメモリの過剰消費を防止するために、調整線スレッドプールスレッドの数は、(各スレッドは、複数のスレッドが開いて、メモリの1メガバイト程度かかり、またメモリを消費します)最後のクラッシュ大きいです。
スレッドプールの使用2.3
トップレベルインターフェース内のJavaスレッドプールはjava.util.concurrent.Executorであるが、厳密な意味エグゼキュータスレッドプールではなく、実行ツールの唯一のスレッド。実際のスレッドプールインタフェースはjava.util.concurrent.ExecutorServiceです。
スレッドプールは、より複雑で設定するには、特にスレッドプールの原理は非常に明確ではありません下のために、スレッドプールの可能性が高いの構成は、このようにjava.util.concurrent.Executors内のスレッドファクトリクラスを提供し、優れていませんいくつかの一般的なスレッドプールを生成するために、いくつかのstaticファクトリ。公式には、スレッドプールオブジェクトを作成するために、エグゼキューエンジニアリングをお勧めします。
次のように執行クラスは、スレッドプールを作成しました:
- パブリック静的ExecutorServiceのnewFixedThreadPool(int型にnthreadsは):スレッドプールオブジェクトを返します。(作成は、プール内のスレッドの数である有界スレッドプールは、最大数を指定することができています)
スレッドプールのExecutorServiceのオブジェクトを取得するには、それを使用する方法を、ここでは次のようにスレッド・プール・オブジェクトを使用する方法を定義します。
- <?>公共今後の提出(Runnableをタスク):1つのスレッドプールのスレッドオブジェクトを取得し、実行します
今後のインターフェース:タスクが完了した後、スレッドの結果を記録するために使用されます。スレッドプールの作成と使用。
スレッドプール:JDK1.5の提供後に
スレッドプールを生成するために使用されるスレッドプールファクトリクラス:java.util.concurrent.Executorsを
静的メソッドエグゼキュータクラス:
静的ExecutorServiceのnewFixedThreadPool(nthreadsの値INTは)再使用可能なスレッドの固定数を作成しますスレッドプールの
パラメータ:
int型にnthreads:スレッドプール内のスレッドの数を作成するには、含まれている
戻り値:
ExecutorServiceのインターフェースクラスオブジェクトは、我々はExecutorServiceの(指向プログラミング・インタフェース)を受信するようにインターフェイスを使用することができ、戻りExecutorServiceのインタフェースを実現することである
java.util.concurrent.ExecutorServiceを:インターフェイスのスレッドプールは
、スレッドプールからスレッドを取得するために使用されるメソッドが呼び出された開始され、タスク実行スレッドが
(Runnableをタスク)を提出、実行用のRunnableタスクを送信し
、シャットダウン方法/スレッドプールの破壊
(ボイドシャットダウン)
スレッドプールオブジェクトを使用して工程(還元):
- スレッドプールオブジェクトを作成します。
- サブクラスのオブジェクトを作成するには、Runnableインタフェース。(タスク)
- 、Runnableインタフェースサブクラスのオブジェクトを提出してください。(タスクを取ります)
- スレッドプール(通常はない)を閉じます。
ステップを使用してスレッドプール:
- newFixedThreadPool提供ファクトリクラスエグゼキュータの内部スレッドプールを使用して静的メソッドは、スレッド、スレッドプールの指定された数を生成します
- 、Runnableインタフェースはrunメソッドをオーバーライドする実装するクラスを作成し、スレッドのタスクを設定します
- ExecutorServiceの提出方法は、実行する方法ねじ切り作業(実装クラス)、オープンスレッドを渡し、中に呼び出し、
- shutdownメソッド呼び出しExecutorServiceの破壊スレッドプール(推奨されません)
コード例:
Demo01ThreadPool.java:
1 インポートjava.util.concurrent.ExecutorService; 2 インポートjava.util.concurrent.Executors; 3。 4。 / * 5。 スレッドプール:JDK1.5を提供後 6。 java.util.concurrent.Executors:スレッドプールファクトリクラスとスレッドプールを生成する 7。 エグゼキュータクラス静的メソッド: 8 (nthreadsの値INT)静的ExecutorServiceのnewFixedThreadPoolするスレッドのスレッドプールの再利用可能な一定数作成する 9 :パラメーター 10 を含むスレッド・プール内のスレッドの数を作成します。int nthreadsの値 11 戻り値: 12 ExecutorServiceのインタフェース、クラスオブジェクトはExecutorServiceのインタフェースを実装返し、我々が使用できるExecutorServiceの(指向プログラミング・インターフェース)を受信インタフェース 13は、 インタフェーススレッドプール:java.util.concurrent.ExecutorService 14 スレッドプールからスレッドを取得するために、開始メソッドを呼び出し、実行タスクのスレッド 15は、 実行のためのRunnableタスク送信(Runnableをタスク)を提出 16 閉鎖/破壊処理スレッドプールを 17 ボイドシャットダウン() 18れる スレッドプールの手順を使用して: 19 newFixedThreadPool提供ファクトリクラスエグゼキュータの内部スレッドプールを使用して1.静的メソッドは、スレッドプール内のスレッドの指定された数を生成する 20 2.が実行可能インターフェースは、実行メソッドをオーバーライド実装するクラスを作成し、スレッドのタスクをセット 21の 3.コールExecutorServiceの方法提出し、転送タスクスレッド(実装クラス)、スレッドターン、実行方法 22 (推奨しません)ExecutorServiceのスレッドプールを破壊するシャットダウン方法4.コール 23はある * / 24 パブリック クラスDemo01ThreadPool { 25 パブリック 静的な 無効メイン(文字列[]引数){ 26れます // newFixedThreadPoolエグゼキュータは、スレッドプールのスレッドの指定された数の内部に設けられたスレッドプールクラス工場の生産使用の静的メソッド 27 ExecutorServiceのExecutors.newFixedThreadPool ES =(2 ;) 28 // 、スレッド転送3.提出ExecutorServiceの呼び出し方法タスク(実装クラス)、オープンスレッド、実行方法 29 es.submit(新新 RunnableImpl()); // プールスレッド-1-1は、実行するために、新しいスレッドを作成し、 30 // スレッドプールは開いたままになりますが、なくなりましたスレッドは、スレッドが自動的に使用し続けることができるスレッドプールのスレッドに返される 31 es.submit(新しい新規 ; RunnableImplを())// プールスレッド1-1が実行する新しいスレッドを作成し 32 es.submitを(新しい新しい RunnableImpl( )); // 。プール2実行の新しいスレッド1のスレッドが作成されます 33は、 34である //4.コールExecutorServiceのメソッドシャットダウン破壊スレッドプール(推奨しません) 35 es.shutdown(); 36 37 es.submit(新新 RunnableImpl()); // 例外を投げるには、スレッドプールを使用すると、スレッドを得ることができない、なくなっています 38 }
RunnableImpl.java:
1 / * 2 2スレッドのタスクを設け、Runnableをインターフェイス、オーバーライドrunメソッドを実装するクラスを作成します 。3 * / 4 @Override 5 公共 ボイドラン(){ 6 のSystem.out.println(にThread.currentThread()。関連項目GetName( 「実行の新しいスレッドを作成する」)+ ); 7 }