抜粋:https://www.cnblogs.com/ruanjianlaowang/p/12014490.html
Javaのマルチスレッドとスレッドプール
1.シーン記述
マルチスレッドはまた、一般的にあるため、以下のように困っている友達を参照することができ、要約の下で、別のページに複数のスレッドを使用する必要性、前にこの時間を使用しています。
2.ソリューション
2.1スレッドプールの概念
事前に池の概念は、(事前に定義された)が作成され、その後のスレッドは、池から直接利益を取ることができます:スレッドプールの公式定義は、人気のことわざの下で、言っているわけではありません。
(1)再作成することなく、リソースのスレッドより消費を作成します。
(2)プールが制御不能を回避するためのスレッドを作成し、最初に定義され、予測不可能なリスクにシステムを引き起こします。
2.2の作成方法
JDK自身のスレッドプールを使用する方法を作成し、JDK1.5はjava.util.concurrentの次のパッケージで提供し始めました。
実際には、表面を作成する2つの方法、1種類があります。
(1)が作成されて、新しいThreadPoolExecutorを使用することです。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
(2)はExecutors.newFixedThreadPool(3)の使用が、スレッドプールのみ、いくつかのデフォルトパラメータを割り当てる、作成されて、新しいThreadPoolExecutorを呼び出すです。
new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
2.3定義
7つのパラメータの合計:
(1)corePoolSize
スレッドの現在の数がまだ数corePoolSizeに達していない場合はタスクがあるスレッドのコア数は、カーネルスレッドを作成して、入って来、カーネルスレッドには、次の特性があります。
図2に示すように、コアのスレッドは、一般的にも、アイドル状態、破壊されない;スレッドの数は、最大コアスレッドに達していない場合にアイドル状態のスレッドが再利用、まだ新しいスレッドのコアがされないであろうがあっても1は、新しいタスクが、入って来法によるallowCoreThreadTimeOut(ブール値)trueに設定されている場合は、タイムアウトがまた破壊される、本番環境が最初に初期化されたとき3、あなたが遅い避けるために、事前にすべてのコアスレッドを作成するために、最初の呼び出しをprestartCoreThread()メソッドを呼び出すことができます。
(2)maximumPoolSize
コアスレッドに加えて、コア戦略は、いくつかの完全に自由な時間にですが、また、タスクを処理するためにいくつかの一時的なスレッドを作成スレッドが、maximumPoolSizeが上限コアスレッド+一時的なスレッドです。一時的なスレッドが乾燥していない設定されたアイドル時の事を超え、タイムアウトメカニズムを持っている、それが破壊されます。
(3)keepAliveTimeが
これは、最大スレッドアイドル時間である、上述二つにタイムアウトパラメータであり、デフォルト非コアスレッドがallowCoreThreadTimeOut(ブール値)メソッドのセットによって使用され、それがコア糸に使用されます。
(4)ユニット
KeepAliveTimeの上記で、このパラメータは、指定したタイムアウト単位、秒、分、時間、などで
(5)ワークキュー
コアスレッドがアイドル状態でない場合は、タスクキューは、実行されるのを待って、そして新しいタスクが待ちキューに配置されます。
(6)threadFactory
これは、スレッド名形式が背景かどうかというように、あなたがExecutors.defaultThreadFactoryを使用することができ、定義されているスレッドを実現する方法を生成するためのインタフェースである()デフォルトの実装もあれば、そのようなグアバパーティのライブラリーなどの方法によって達成することができ、することができ特別な要件は、あなたがあなた自身を定義することができ、があります。これは、最も重要な場所は簡単にそれをトラブルシューティングするために、スレッド名形式の定義であるべきです。
(7)ハンドラ
そこにタスクを処理するアイドルスレッドがなく、キューがいっぱいになっている(もちろん、これが唯一の有界キューのために働く)し、新しいタスクがあるときに来る、あなたには、いくつかのトレードオフを行い、このパラメータは政策のトレードオフを指定することである一方で、次の4つがあります戦略の種類を選択することができます。
ThreadPoolExecutor.AbortPolicy:直接スローデフォルトの戦略である例外、;
ThreadPoolExecutor.DiscardPolicy:破棄したタスクが、例外をスローしません。
ThreadPoolExecutor.DiscardOldestPolicy:一番のタスクキューを破棄し、新しいタスクが待っているキューに追加
ThreadPoolExecutor.CallerRunsPolicy:そのような主な機能には、スレッドプールを作成するなどの処理タスク、スレッドプールからのスレッドは、このポリシーの実装ならば、そこにされますタスクを実行するためにメインスレッド
2.4テストの検証
2.4.1テスト・スレッド
package com.yutong.laowang.test;
public class ThreadTest extends Thread{ @Override public void run() { System.out.println("软件老王:" +Thread.currentThread().getName()); } }
2.4.2エグゼキュータを作成
private static void test4() { Executor mExecutor = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { Thread thread = new ThreadTest(); mExecutor.execute(thread); } }
結果:
软件老王:pool-2-thread-2
软件老王:pool-2-thread-3
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-2
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-2
软件老王:pool-2-thread-3
软件老王:pool-2-thread-1
2.4.3作成ThreadPoolExecutor
private static void test3() { int poolSize = 5; int queueSize = 100; ExecutorService executorService = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize), new ThreadPoolExecutor.AbortPolicy()); for (int i=0;i<10;i++) { executorService.submit(new ThreadTest()); } }
結果:
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-4
软件老王:pool-2-thread-2
软件老王:pool-2-thread-5
软件老王:pool-2-thread-5
软件老王:pool-2-thread-1
软件老王:pool-2-thread-2
软件老王:pool-2-thread-2
软件老王:pool-2-thread-1
2.4.4スレッドの使用禁止
thread.interrupt();
---有时候不一定能执行成功,一般会结合判断使用,软件老王,例如:
在ThreadTest类中进行判断,默认为false,当满足条件下为true,停用线程。
public volatile boolean exit = false;
私は可能性がある場合、私が知っている次の聖歌、その後の更新秒を集中する、と感じた「ソフトウェアファラオ」です!ようこそフォーラムは、第パブリックメッセージ交換を同名!
1.シーン記述
マルチスレッドはまた、一般的にあるため、以下のように困っている友達を参照することができ、要約の下で、別のページに複数のスレッドを使用する必要性、前にこの時間を使用しています。
2.ソリューション
2.1スレッドプールの概念
事前に池の概念は、(事前に定義された)が作成され、その後のスレッドは、池から直接利益を取ることができます:スレッドプールの公式定義は、人気のことわざの下で、言っているわけではありません。
(1)再作成することなく、リソースのスレッドより消費を作成します。
(2)プールが制御不能を回避するためのスレッドを作成し、最初に定義され、予測不可能なリスクにシステムを引き起こします。
2.2の作成方法
JDK自身のスレッドプールを使用する方法を作成し、JDK1.5はjava.util.concurrentの次のパッケージで提供し始めました。
実際には、表面を作成する2つの方法、1種類があります。
(1)が作成されて、新しいThreadPoolExecutorを使用することです。
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
(2)はExecutors.newFixedThreadPool(3)の使用が、スレッドプールのみ、いくつかのデフォルトパラメータを割り当てる、作成されて、新しいThreadPoolExecutorを呼び出すです。
new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
2.3定義
7つのパラメータの合計:
(1)corePoolSize
スレッドの現在の数がまだ数corePoolSizeに達していない場合はタスクがあるスレッドのコア数は、カーネルスレッドを作成して、入って来、カーネルスレッドには、次の特性があります。
図2に示すように、コアのスレッドは、一般的にも、アイドル状態、破壊されない;スレッドの数は、最大コアスレッドに達していない場合にアイドル状態のスレッドが再利用、まだ新しいスレッドのコアがされないであろうがあっても1は、新しいタスクが、入って来法によるallowCoreThreadTimeOut(ブール値)trueに設定されている場合は、タイムアウトがまた破壊される、本番環境が最初に初期化されたとき3、あなたが遅い避けるために、事前にすべてのコアスレッドを作成するために、最初の呼び出しをprestartCoreThread()メソッドを呼び出すことができます。
(2)maximumPoolSize
コアスレッドに加えて、コア戦略は、いくつかの完全に自由な時間にですが、また、タスクを処理するためにいくつかの一時的なスレッドを作成スレッドが、maximumPoolSizeが上限コアスレッド+一時的なスレッドです。一時的なスレッドが乾燥していない設定されたアイドル時の事を超え、タイムアウトメカニズムを持っている、それが破壊されます。
(3)keepAliveTimeが
これは、最大スレッドアイドル時間である、上述二つにタイムアウトパラメータであり、デフォルト非コアスレッドがallowCoreThreadTimeOut(ブール値)メソッドのセットによって使用され、それがコア糸に使用されます。
(4)ユニット
KeepAliveTimeの上記で、このパラメータは、指定したタイムアウト単位、秒、分、時間、などで
(5)ワークキュー
コアスレッドがアイドル状態でない場合は、タスクキューは、実行されるのを待って、そして新しいタスクが待ちキューに配置されます。
(6)threadFactory
これは、スレッド名形式が背景かどうかというように、あなたがExecutors.defaultThreadFactoryを使用することができ、定義されているスレッドを実現する方法を生成するためのインタフェースである()デフォルトの実装もあれば、そのようなグアバパーティのライブラリーなどの方法によって達成することができ、することができ特別な要件は、あなたがあなた自身を定義することができ、があります。これは、最も重要な場所は簡単にそれをトラブルシューティングするために、スレッド名形式の定義であるべきです。
(7)ハンドラ
そこにタスクを処理するアイドルスレッドがなく、キューがいっぱいになっている(もちろん、これが唯一の有界キューのために働く)し、新しいタスクがあるときに来る、あなたには、いくつかのトレードオフを行い、このパラメータは政策のトレードオフを指定することである一方で、次の4つがあります戦略の種類を選択することができます。
ThreadPoolExecutor.AbortPolicy:直接スローデフォルトの戦略である例外、;
ThreadPoolExecutor.DiscardPolicy:破棄したタスクが、例外をスローしません。
ThreadPoolExecutor.DiscardOldestPolicy:一番のタスクキューを破棄し、新しいタスクが待っているキューに追加
ThreadPoolExecutor.CallerRunsPolicy:そのような主な機能には、スレッドプールを作成するなどの処理タスク、スレッドプールからのスレッドは、このポリシーの実装ならば、そこにされますタスクを実行するためにメインスレッド
2.4テストの検証
2.4.1テスト・スレッド
package com.yutong.laowang.test;
public class ThreadTest extends Thread{ @Override public void run() { System.out.println("软件老王:" +Thread.currentThread().getName()); } }
2.4.2エグゼキュータを作成
private static void test4() { Executor mExecutor = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) { Thread thread = new ThreadTest(); mExecutor.execute(thread); } }
結果:
软件老王:pool-2-thread-2
软件老王:pool-2-thread-3
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-2
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-2
软件老王:pool-2-thread-3
软件老王:pool-2-thread-1
2.4.3作成ThreadPoolExecutor
private static void test3() { int poolSize = 5; int queueSize = 100; ExecutorService executorService = new ThreadPoolExecutor(poolSize, poolSize, 0L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(queueSize), new ThreadPoolExecutor.AbortPolicy()); for (int i=0;i<10;i++) { executorService.submit(new ThreadTest()); } }
結果:
软件老王:pool-2-thread-1
软件老王:pool-2-thread-3
软件老王:pool-2-thread-4
软件老王:pool-2-thread-2
软件老王:pool-2-thread-5
软件老王:pool-2-thread-5
软件老王:pool-2-thread-1
软件老王:pool-2-thread-2
软件老王:pool-2-thread-2
软件老王:pool-2-thread-1
2.4.4スレッドの使用禁止
thread.interrupt();
---有时候不一定能执行成功,一般会结合判断使用,软件老王,例如:
在ThreadTest类中进行判断,默认为false,当满足条件下为true,停用线程。
public volatile boolean exit = false;
私は可能性がある場合、私が知っている次の聖歌、その後の更新秒を集中する、と感じた「ソフトウェアファラオ」です!ようこそフォーラムは、第パブリックメッセージ交換を同名!