スレッドプールのスレッドが、なぜ、スレッドプールを使用します
1、スレッド内のAndroid
区別メインスレッドとAndroidで子スレッド。メインスレッドは、子スレッドは、主になど、いくつかのネットワーク運用、IO要求、などのより大きな時間のかかるタスクの一部に対処するために使用されている間、主に、いくつかのものとインターフェース関連に対処するために、UIスレッドとして知られています あなたは、メインスレッドでこれらの時間のかかるタスクを処理した場合、現象ANR(アプリケーションが直接立ち往生)があるかもしれません。
プール内の2、Androidのスレッド
私たちは上に新しいスレッド、スレッド管理、スレッドのスケジューリングとで役割を果たしている池が、含まれているスレッドプールのスレッドの名前の意味を知っているショーからスレッドプール、。
3.なぜ私は、スレッドプールを使用する必要があります
今のAndroidは、すでにスレッドの概念を持っていることを、なぜスレッドプールにそれを使用する必要がありますか?我々は2つの側面からスレッドプールを使用する理由を与えます。
- まず、すべてのスレッドの新規を消費し、財産の破壊が存在している、一定の期間のネットワーク要求の数が多い場合は、性能の損失が想像することができ、複数のスレッドを作成し、破壊する必要があります。
- 第二に、実行期間の複数のスレッドがCPUを占有しますがあります。私たちは、1つのCPUがある場合は、スレッドを実行するCPUは、各スレッドに時間が割り当てられます順番に実行されていることを知っています。複数の子を同時にスレッドがある場合のAppは非常に可能性の高いカトン現象を表示されますので、その後、メインスレッドに割り当てられ、対応するCPUの実行時間は、少なくなっています。上記二つの理由を考慮して、我々はスレッドプールの破壊によって管理されているなど、このようなスレッドプール、スレッドの作成、スケジューリング、の概念をもたらすので、あなたは、スレッドは、常に新しいスレッドを作成しないでください再利用することができ、スレッドの作成と財産の損失の破壊を減らします。あなたは、メインスレッドのリソースをつかむために、複数のスレッドを制御することができるようにスレッドアプリケーションの数は、管理可能範囲に保たれるように、同時に、スレッドプールは、作成されたスレッドの数が制限されます。
二、スレッドプールの導入でAndroidの
1、スレッドプールの建設
AndroidのスレッドプールではThreadPoolExecutorオブジェクトです。私たちは、最初のThreadPoolExecutorのコンストラクタを見てください。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
复制代码
我々はいくつかのパラメータの現在の意味について語った:最初のパラメータはcorePoolSizeのあるスレッドのコア数は、それは非常に多くのスレッドがタスクを実行するためにどのスレッドがない場合でも、少なくともプール内にあると言うことです。スレッドプールallowCoreThreadTimeOutがtrueに設定されている場合でも、これには例外があるが、その後、されたタイムアウト(keepAliveTimeが)カーネルスレッドは、到着後に破棄されます。第2のパラメータは、maximumPoolSizeあるスレッドプール内のスレッドの最大数。アクティブなスレッドの数がこの数に達すると、新しいタスクが、後にブロックされて追加されます。3番目のパラメータはkeepAliveTimeがされているスレッドのキープアライブ時間は、コア、スレッドプールのスレッド数よりも多くのスレッドがある場合は、あること、そしてkeepAliveTimeがより、新しいタスクが来ない場合は、スレッドの作業ではありません現時点でタイマーを開始します、スレッドが破棄されます。セットallowCoreThreadTimeOutが真である場合と、時間が前記第一の上でのタイムアウト。第4パラメータユニットタイミング・パラメータの第三のユニットように、そこミリ秒、秒、および。第5パラメータワークキュータスクキュースレッドプール、キューは、executeメソッドにより渡さ(オブジェクトが実行可能なタスクである)Runnableオブジェクトを保持しています。タスクキューの数は、(アクティブなスレッドは、スレッドの最大数に達した)一杯になった場合、操作を追加し、タスクキューのこのタイプはBlockQueueタイプであり、それは、タスクキューの数が0の場合、タスクを取る操作がブロックされ、キューをブロックしていますそれがブロックされます。第六のパラメータthreadFactoryはスレッドファクトリ新しいスレッドプールのスレッドを作成する必要がある場合、スレッドファクトリは、スレッドプールにスレッドを提供するために使用します。する第パラメータハンドラポリシーを拒否キューが満杯である場合、スレッドプールは、有界キューを使用する場合は、(すなわち、5番目のパラメータである)、タスクは場合拒絶ポリシースレッドプールに追加されます。
2、スレッドプールの分類
I、FixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
复制代码
私たちは、ThreadPoolExecutorコンストラクタと呼ばれるFixedThreadPoolの建物を見ることができます。それ以上のいくつかの機能のFixedThreadPoolを呼び出して見ることができますから:
- これは、スレッドのコアの数だとスレッドの最大数は、スレッドがアイドル状態のときにスレッドが破壊されないことを意味し、同じである(なぜなら、スレッドとコアとしてスレッドの最大数の数)。真allowCoreThreadTimeOutに設定した場合でも、その時に、スレッドプールのスレッドを意味keepAliveTimeが0に設定されたスレッドのキープアライブ時間は、アイドル状態ですぐに破棄されます。すべてのスレッドがアクティブな場合、新しいタスクが待ち状態になり、アイドル状態のスレッドがある場合に実行しました。
II、CacheThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
复制代码
あなたはCacheThreadPool ThreadPoolExecutorコンストラクタを構築するための呼び出しを見ることができます。以上のことから、それはのいくつかの機能のCacheThreadPoolを呼び出して見ることができます。
- そのコアのスレッド数はInteger.MAX_VALUEでのスレッドの最大数は、(限定として見ることができる)、0です。KeepAliveTimeのスレッドキープアライブ時間は60秒です。これは、プール内のすべてのスレッドがアクティブな場合、タスクを実行する新しいスレッドを作成することを意味し、そこにはコアスレッドではありませんが、スレッドが生き続けるために60秒を持っている、とがアイドル状態のスレッドプールのスレッドが(がある場合すぐにダウンアイドルアイドルスレッドの使用に)破壊されません。スレッドがタスクがそれにタスクを追加することができます行うことができますがある場合にのみタスクキューSynchronousQueue同期ブロッキングキューは、そのキューは、任意の容量を持っていないことに留意すべきです。上記CacheThreadPoolの特性から分かるように存在スレッドはいつでもタスクを実行することができる(またはするために、新しい、またはアイドル状態のスレッドである)ことを確実にするため、障害物が現れません。具体的に説明BlockQueueについては、我々は見ることができますJavaのマルチスレッド- -BlockQueueツールの記事この記事を。だから、プロパティCacheThreadPool私たちは多くのタスクを実行する必要がありますが、これらのタスクは時間がかかり、比較的低いため、CacheThreadPoolを使用することを検討してください。
III、ScheduledThreadPool
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
复制代码
あなたはのScheduledThreadPoolExecutor ThreadPoolExecutorコンストラクタを構築するための呼び出しを見ることができます。以上のことから、それはのいくつかの機能のScheduledThreadPoolExecutorのを呼び出して見ることができます。
- Integer.MAX_VALUEのにスレッドの最大数は、(限定として見ることができる)しながら、スレッドの中核数は、固定されています。KeepAliveTimeのスレッドは、キープアライブ時間がゼロです。これは、スレッドプール内のスレッドの数がコアスレッドがダウンアイドル超えた場合はすぐに破壊されることを意味します。ScheduledThreadPoolは、一般的にいくつかのタスクを実行するために使用されるか、またはタイミングタスクは、いくつかの一定期間繰り返されます。異なる遅延executor.schedule(いくつかの異なるオーバーロードされた方法がある)は、それぞれ、タイミングサイクル反復作業によって行われてもよいです。
IV、SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
复制代码
あなたはSingleThreadExecutor ThreadPoolExecutorコンストラクタを構築するための呼び出しを見ることができます。以上のことから、それはのいくつかの機能のSingleThreadExecutorを呼び出して見ることができます。
- スレッドの中核数が1スレッドの最大数であり、1であり、keepAliveTimeがは最大スレッドプールのスレッドが存在し、スレッドが実行中またはアイドル状態であるか否かのみを許可することを意味し、0であるスレッドのキープアライブ時間がありませんそれは破壊されます。すべてのタスクがスレッドで順番に実行されることを保証するためにSingleThreadExecutor。