Javaスレッドプールexecutorservice
1。スレッドプール
1.1どのような状況でスレッドプールを使用していますか?
1.2スレッドプールを使用することの利点
2.ExecutorServiceおよび執行者
2.1はじめに
executorserviceは、エグゼクターを継承するインターフェイスです。
パブリックインターフェイスexecutorservice拡張エグゼキューター{}執行者はインターフェイスでもあり、1つの方法のみが含まれています。
public interface executor {void execute(runnableコマンド);} Javaのスレッドプールのトップレベルのインターフェイスは予算書ですが、厳密に言えば、>> Exectorはスレッドプールではなく、スレッドを実行するための単なるツールです。実際のスレッド>プールインターフェイスはExecutorServiceです。
3.執行者
これは静的な工場クラスであり、さまざまな種類のスレッドプールを生成できます。ソースコードの一部は次のとおりです。
パブリッククラスexecutors {// newfixedthreadpoolpublic static executorservice newfixedthreadpool(int nthreads){return new SthreadPoolexecutor(nthreads、nthreads、0l、timeunit.milliseconds、new linkedblockingqueue <runnable>();} newCachedThreadPool(){return new ThreadPoolexecutor(0、integer.max_value、60l、timeunit.seconds、new synchronousqueue <runnable>()); } // newscheduledthreadpool public static Static StechuledExexecutorservice NewsCheduledThreadPool(int corepoolsize){return new scheduledthreadpoolexecutor(corepoolsize); } // NewStringooo}まず特定の例を見て、例を使用して、それらの類似点と相違点を説明しましょう。
パッケージスレッド; java.util.concurrent.executorservice;インポートjava.util.concurrent.executors; import java.util.concurrent.scheduledexecutorservice;/*** Yangが16-7-7-11に作成しました。 */public class ch09_executor {private static void run(executorservice threadpool){for(int i = 1; i <5; i ++){final int taskid = i; threadpool.execute(new runnable(){@override public void run(){for(int i = 1; i <5; i ++){try {shood.sleep(20);} catch(arturtedexception e){e.printstacktrace();} system.out.out.out.println( "+taskid+" execution "" exection " ThreadPool.ShutDown();単一のスレッドのプールは、タスクを実行している場合、それを交換して、exectors.newsinglethreadexecutor()を継続します。 //(1)// run(cachethreadpool); //(2)// run(singlethreadpool); //(3)// run(scheduledthreadpool); //(4)}}4。4一般的に使用されるスレッドプール
4.1 CachedThreadPool
CachedThreadPoolは、初期化されたスレッドをキャッシュし、終了し、キャッシュから6秒間使用されていないスレッドを削除するキャッシュ領域を作成します。
スレッドが使用可能な場合は、以前に作成されたスレッドを使用してください。スレッドが使用できない場合は、新しいスレッドを作成します。
。再利用:
キャッシュタイプのプール、最初にプールに作成されたスレッドがあるかどうかを確認します。ある場合は、再利用してください。誰もいない場合は、新しいスレッドを作成してプールに追加します。
シナリオを使用してください:
キャッシュプールは通常、寿命が短い非同期タスクを実行するために使用されるため、接続指向のデーモンタイプのサーバーではあまり使用されません。
タイムアウト:
再利用できるスレッドは、タイムアウトアイドル内のプール内のスレッドでなければなりません。デフォルトのタイムアウトは60年代です。このアイドルの期間を超えた場合、スレッドインスタンスが終了し、プールが削除されます。
仕上げる:
cachedthreadpoolに入れられるスレッドは、その終わりを心配する必要はありません。タイムアウト後に非アクティブな場合、自動的に終了します。
例説明:
(2)のコメントを削除して実行します。操作の結果は次のとおりです。
最初のタスクの初めて、3回目のタスクの3回目、2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目最初のタスクの4番目の4番目、最初のタスクの4番目の4番目のタスクの4番目、最初のタスクの4番目の4番目の時間、最初のタスクの4番目の4番目の4番目の4番目の4番目、4番目のタスクの4番目の4番目の時間、4番目のタスクの4番目のタスク4番目の4番目のタスクの4番目の時間の4番目の時間の4番目の時間の4番目の時間の4番目の時間の4番目の時間の4番目の時間の4番目の時間の4番目のタスクの4番目。最初のタスクの4番目の4番目の4番目の第4回、最初のタスクの4回目の4回目、最初のタスクの4回目の4回目の4回目、4回目の4回目の4回目、4回目の4回目、4回目の4回目、4回目
結果から、4つのタスクが交互に実行されることがわかります。
4.2fixedthreadpool
sixedthreadpoolには、固定サイズのプールがあります、
現在実行する必要がある場合、タスクを実行する必要がある場合、タスクを実行するための無料スレッドが発生するまで、多くの発信タスクが待機状態になります。
現在実行する必要があるタスクがプールサイズよりも小さい場合、アイドルスレッドは破壊されません。
再利用:
sixedthreadpoolはcachethreadpoolに似ており、再利用できる場合は使用することもできますが、いつでも新しいスレッドを作成することはできません。
固定番号
その独自性は、いつでも、固定数のアクティブスレッドしか存在できないということです。この時点で、新しいスレッドが確立される場合、別のキューに配置し、現在のスレッドのスレッドが終了し、プールから直接移動するまで待つことができます。
タイムアウト:
Cachethreadpoolとは異なり、SixedThreadPoolにはアイドルメカニズムがありません
シナリオを使用してください:
したがって、ほとんどの固定されたThreadPoolは、非常に安定した固定された定期的な同時スレッドを対象としており、ほとんどがサーバーで使用されています
ソースコード分析:
メソッドのソースコードから判断すると、キャッシュプールと固定プールは同じ基礎となるプールを呼び出しますが、パラメーターは異なります。
固定プールスレッドカウントは固定されており、0秒アイドル(アイドルなし)です
キャッシュプールスレッドの数は0-integer.max_valueをサポートしています(明らかに、ホストのリソース許容度はまったく見なされません)、60秒アイドル
例説明:
(1)のコメントを削除すると、実行中の結果は次のとおりです。
最初のタスクの初めて、最初のタスクの3回目、2回目のタスクの2回目の3回目、2回目のタスクの2回目の2回目の3回目、2回目のタスクの2回目の3回目、2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の3回目の3回目の3回目は3回目の3回目の3回目、2回目のタスクの3回目、 2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の4回目の4回目の4回目の4回目の4回目の4回目の4回目の4回目の4回目の4回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目の2回目4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目は、4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目は、4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目は、4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目の4番目4回目の
固定サイズのスレッドプールは3の容量で作成され、その後、ループで4つのタスクが実行されました。出力の結果から、最初の3つのタスクが最初に実行され、次にアイドルスレッドが4番目のタスクを実行したことがわかります。
4.3SingLethReadExecutor
(3)コメントを削除します。次のように実行の結果を参照してください。
最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの最初のタスクの第4タスクの第2タスクの第2タスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目の2番目のタスクの2番目の2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの2番目のタスクの第3タスクの第3タスクの第3タスクの第3タスクの第3タスクの第3タスクの3番目のタスクの3番目のタスクの3番目のタスクの3番目のタスクの3番目のタスクの3番目のタスクの第3タスクの2番目のタスクの2番目のタスクの2番目のタスク4番目のタスクの4番目のタスクの4番目のタスク4番目のタスクの4番目のタスク4番目のタスクの4番目のタスクの4番目のタスク4番目のタスク4番目のタスクの4番目のタスク4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクの4番目のタスクは4番目のタスクです。
4つのタスクは順次実行されます。
4.4 ScheduledThreadPool
ScheduledThreadPoolは、固定サイズのスレッドプールです。 sixedthreadpoolと同様に、実行されたタスクはタイムされたタスクです。
(4)の注釈を削除することで得られた結果は、sixedthreadpoolによって得られた結果と同じです。スケジュールされたThreadPoolの主な理由はここではなく、タイミングのあるタスクです。次の例を参照してください。
パッケージスレッド; Import java.util.concurrent.executors; Import java.util.concurrent.scheduledexecutorservice; Import java.util.concurrent.timeunit;/*** Yangが16-7-11に作成しました。 */public class myscheduledtaskを実装してrunnable {private string tname; public myscheduledtask(string name){this.tname = name; } public void run(){system.out.println(tname+"タスク遅延実行2秒!"); } public static void main(string [] args){scheduledexecutorservice scheduledpool = executors.newscheduledthreadpool(2); ScheduleDexecutorservice SingsChedulePool = executors.NewSingLethReadScheduleDexecutor(); myscheduledtask mt1 = new myscheduledtask( "mt1"); myscheduledtask mt2 = new myscheduledtask( "mt2"); // scheduledThreadPoolでMT1タスクを起動して、ScheduleDpool.schedule(MT1,2、TimeUnit.seconds)を実行します。 // singlescheduledthreadpoolでMT2を開始します。 Singschedulepool.schedule(mt2,2000、timeunit.milliseconds); ScheduleDpool.shutdown(); Singschedulepool.shutdown(); }}結果:
MT1タスクは、実行するために2秒遅れます! MT2タスクは、実行するために2秒遅れます!
結果は、プログラムが2秒間実行された後に表示されず、2秒後にスレッドが実行されたことを示します。
読んでくれてありがとう、私はそれがあなたを助けることができることを願っています。このサイトへのご支援ありがとうございます!