Androidのデフォルトのプログラムは、プロセス、複数のスレッドを含めることができるプロセスです。
マルチスレッド - はじめに
定義:同時に複数のスレッド、すなわち、複数のタスクを同時に。
注意:
- 実際には、任意の時点でコンピュータが1つのタスクのみを実行することができます。
- マルチスレッドは、唯一の錯覚です:JVM高速スケジューリングリソースは、同時に複数のタスクを実行するだけであるかのように見えるので、スレッドの実行を回転ターンを取るために継続するという理由だけで。
A、Androidのスレッドクラスとアクション
アプリケーション別1.1
- メインスレッド:
定義:プログラム開始Androidのシステムが自動的にメインスレッドを開始します
効果:四つの成分の処理は、ユーザ(例えば、UI、関連インタフェースインタラクション)と相互作用を行います
注:すべての回でメインスレッドの必見は、高い応答速度を維持するように、ユーザー・インターフェースとの相互作用は、任意の時点で発生するため、メインスレッドが時間のかかる操作を許可しないように、ANRがあるだろう
- 子スレッド:
定義:基本実行ユニット&CPUの最小単位のプログラム実行の流れ。
処置:そのようなネットワークの要求、複雑な計算など、時間のかかるプロセス操作は、同時に並行オペレーティング・システムのパフォーマンスを向上させるために支払って実行時間とメモリのプログラムを、低減します。
示されるように、スレッドのサブ状態:
-------------------------------------------------- -------- スレッド ----------------------------------------- --------------------
2.2形状によれば:
一、スレッド
1.説明: 基本的なスレッドは、あなたが頻繁に使用ハンドラで、いくつかの簡単な操作を行うことができます。
2、主な機能をスレッド:
RUN() :コードスレッドのランタイム実行
開始():スレッドを開始
睡眠():スレッドの睡眠は、ブロックされた状態にし、睡眠方法は、ロックを解除しません
収量():スレッド降伏CPUが、ブロックしたがレディ状態にリセットされていませんが、ロックを解除しません
割り込み():割り込みスレッドは、ブロックされた状態のスレッドにのみ注意を払うを中断しました
setdaemon():セットとスレッドかどうかガードを取得
3、いくつかの状態スレッド
新国家(新新):この状態は、インスタンス化の後に入力されます。
レディ状態(Runnableを):スレッドの呼び出しが待ちCPUに()の実行準備状態を開始した後、このポイントに注意を払うだけを意味するものではありませんが、すでに実行されていることを実行することができます。
動作状態(実行):CPUのスレッドが実行されます、そして実行run()メソッドを開始します。
(ブロック)ブロックされた:様々な理由にブロックされた状態にスレッド:参加する()、スリープ() 、待機()は、 トリガ条件を待って、待っているが、別のスレッドロックによって占められます。
死の状態(デッド):スレッドが完成し、実行中または異常終了を持って、使用のisAlive()は状態を取得します。
4、スレッドでのAndroidの使用
1.1、相続スレッド、書き換えrun()
方法。
1.2、 Runnableを、書き換え達成するためのrun()
タスクを実行する方法を
1.3、ハンドラによりスレッドを開始
スレッドを終了する方法5、
1.1、マーカーとしてブール変数を使用して
使用して1.2、interrupt()
:通常動作スレッド 割り込みスレッドの代わりに、スレッドの終了を。
ブロックされたスレッド:例外、ループの外の使用にこの例外をスローします。
1.3使用してstop()
スレッドを終了する方法
これは、データ損失の場合は良いよりも害で強制的にシャットダウンと同等です。
6、セキュリティスレッドとスレッド同期
1.1セキュリティスレッドとは何ですか?
簡単に言えば、セキュリティスレッドが混乱の結果、データが得られ、同じコードやデータにアクセスする複数のスレッドを指します。
1.2、解決方法:
(1)同期 キーワード、同時に方法にその一つだけスレッドまたはブロックへのアクセスを確保します。
(2)揮発性特別可変ドメインは、変数を変更した仮想マシンに指示する変数はいつでも更新されてもよい、各時間の使用を再計算され、代わりに、レジスタの値を使用します。
(3)ReentrantLockの: スレッド同期のために使用リエントラントロック。
(4)ThreadLocalの管理変数は:この変数は、それぞれ他のコピーの独立変数のコピーを、受信する各スレッドのために使用されます。
-------------------------------------------------- - AsyncTask ------------------------------------------------ --------------
二、AsyncTask
1、説明:軽量クラス非同期操作、UIを更新するのは簡単。
2、原則は:ハンドラと2つのスレッド・プールをカプセル化します。
(1)スレッドプールのTHREAD_POOL_EXECUTOR:という真の使命スレッド
(2)スレッドプールSERIAL_EXECUTOR:タスクスケジューラは、(順番に配置されたタスクに複数のスレッドを可能にします)
(3)は AsyncTask作成WorkerRunnableオブジェクトインスタンスmWorkerをとFutureTaskオブジェクトmFutureを。FutureTaskの髪とのRunnableの役割としてクラス行為です。次は、実際のタスクを処理するために、シリアルラインとのワーカースレッドを使用します。
(4)あなたがオブジェクトを作成するミッションにWorkerRunnable FutureTaskオブジェクト、FutureTaskにパラメータとして渡されrun()
たときに呼び出しがWorkerRunnable call()
ので、メソッドcall()
メソッドは、スレッドプールで行われます。
(5)メインスレッドハンドラー。
- 呼び出し()メソッドを呼び出した後、doInBackgroundを呼び出し、結果を返します。
- このプロセスは、タスクがセットAsyncTaskの終了を相殺してキャッチします。
call()
最後の方法postResult(result)。
- メインスレッドハンドラ、通信ワーカースレッドとメインスレッドを取得します。
3、パラメータ、およびコア機能
AsyncTaskはまた、4つのコアメソッドを提供します。
protected void onPreExecute()
:メインスレッドの前に準備作業を呼び出す非同期タスクを実行します。protected abstract Result doInBackground(Params... var1)
:プール内の実行スレッドは、非同期タスクを実行するために使用されます。PARAMSをすることにより、この方法では、非同期タスクの入力パラメータを表しpublishProgress、更新作業進捗方法publishProgress順番に呼び出しonProgressUpdateメインスレッドの進捗の更新を達成する方法を。このメソッドが返すは、結果にonPostExecuteの方法。protected void onProgressUpdate(Progress... values)
:実行のメインスレッドでは、バックグラウンドタスクの実行スケジュールの変更は、このメソッドを呼び出します。protected void onPostExecute(Result result)
:メインスレッドの実行、非同期タスクのコールの後、結果パラメータがあるdoInBackgroundが返されます。
4、AsyncTask注意
- AsyncTaskオブジェクトクラスは、メインスレッドの負荷で作成する必要があります。
- 実行方法は、UIスレッドで呼び出さなければなりません。
- A AsyncTaskオブジェクトのみをすることができ、一度行ってメソッドを実行した後にのみそれ以外の場合は、レポート実行時例外、と呼ばれることができます。
5、利点
- シンプルで迅速かつ簡単に使用します。
- UIは、タイムリーにプロセス制御を更新します。
6、欠点
複数の非同期操作はUIを更新する必要がある1は、それが問題となります。
-------------------------------------------------- - HandlerThread ------------------------------------------------ -----
三、HandlerThread
1.説明:使用ルーパー、ハンドラスレッド。
2、原則
(1)継承されたスレッドは、実際にルーパー、ハンドラのスレッドです。
(2)において、スレッドを継承run()
することによって、プロセスLooper.prepare()
、メッセージ・キューを作成Looper.loop()
メッセージループを処理します。
(3) HandlerThreadを使用する場合ルーパーの結合ハンドラとHandlerThreadを作成し、開き、ハンドラメッセージ通知HandlerThreadの方法は、特定のタスクを実行します。
(4) HandlerThread内部を繰り返し動作させるための子スレッドを作成し、破壊を避けるために、メッセージキューを維持します。
3、用例:
//创建HandlerThread实例,参数字符串定义新线程的名称。
HandlerThread mHandlerThread = new HandlerThread("check-message-coming");
//启动HandlerThread线程。
mHandlerThread.start();
//Handler与HandlerThread绑定
Handler mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
@Override
public void handleMessage(Message msg){
// 进行耗时操作
}
};
注:覚えておくonPause()
とonDestroy()
、一時停止してメモリを解放するmHandlerThreadの更新を停止します。
-------------------------------------------------- --- IntentService ---------------------------------------------- -------
四、IntentService
1、説明: IntentService封入HandlerThread及びハンドラ、IntentService封入HandlerThread及びハンドラ。
2、原則:
- あなたがHandlerThread IntentServiceを作成するときにハンドラがHandlerThreadを結合しながら、開始します。したがって、ハンドラによって送信されたメッセージはHandlerThreadで実行されています。
- その後のライフサイクルにIntentService
onStartCommand
リコールは、onStart
メッセージハンドラの形で渡されたインテントオブジェクトを使用して送信されます。 - ハンドラがメッセージを受け取った後に呼び出されます
onHandleIntent
私たちは、自分の処理ロジックを実現する必要があることを、このような抽象メソッドを。最後に処理されたstopSelf(msg.arg1);
完全なエンドIntentServiceにすべてのタスクの待機を。
-------------------------------------------------- ----- スレッドプール ------------------------------------------- ------------------
第五に、スレッドプール
1、原理:
スレッドプールの概念ではAndroidがJavaの執行に来て、エグゼキュータは、真のスレッドのインタフェースがThreadPoolExecutorです。(ThreadPoolExecutorがAbstractExecutorServiceがAbstractExecutorServiceがExecutorServiceの実装クラスであり、継承、ExecutorServiceのは、エグゼキュータインタフェースを継承しました)。
2、利点:
- プール内のスレッド再利用、メモリのオーバーヘッドによってもたらさ頻繁にスレッドの作成と破壊を回避。
- 原因スレッド間のリソースをつかむために起因する現象をブロックしないようにする同時スレッドの最大数の効果的なコントロール。
- これは、単純なスレッド管理、実行すること、およびタイミング・サイクルの実行時間間隔指定された機能を提供することができます。
3、スレッドプールの分類
(1。)、 FixedThreadPool(固定:固定、不変)
エグゼキュータによってnewFixedThreadPool
作成、パラメータの作成を通して見ることができると、次の特性:
- スレッドとスレッドの固定数は、コアであるコアスレッドの数及びスレッドの最大数は、nthreadsの値です。
- 彼らは、コアスレッドであり、外部からの要求に対応する迅速な復旧がないだろう。
- いいえ、タイムアウトメカニズムは、タスクキューにはサイズ制限はありません。
- 空きコアスレッドが存在しない場合はコア糸を使用して、新しいタスクは、実行のためにキューに入れられています。
(2)、CachedThreadPool(キャッシュ:キャッシュ)
エグゼキュータによってnewCachedThreadPool
作成、それが機能します:
- スレッドの可変数、唯一の非コア糸、スレッドの最大数は、任意の大きさ:0であるパラメータスレッド、スレッドInteger.MAX_VALUEでの最大数の受信コア番号;
- 実行のアイドル状態のスレッドを使用して新しいタスクがある場合には、アイドルスレッドが処理する新しいスレッドを作成しませんがあります。
- 、より多くの60年代アイドル状態のスレッドの回復よりもアイドル:アイドルスレッドプールのスレッドのそれぞれは、多くの場合、60代(60L、TimeUnit.SECONDSパラメータ)のために、タイムアウト機構を備えています。
- 少ない時間のかかるタスクの多数の実装では、すべてのスレッドが60秒以上アイドル状態になるとき停止しているが、それは少しのシステムリソースを占有します。
(3。)、ScheduledThreadPool(スケジュール:所定のスケジュール)
エグゼキュータによってnewScheduledThreadPool
作成、それが機能します:
- コア糸固定数、非コアスレッドを無制限。
- オーバー10Sのための非コアスレッドのアイドルがリサイクルされます。
- 反復的なタスクを実行すると、固定周期を有するタイミングの主なタスク。
- 唯一の機能的サイクル内の四つの遅延が繰り返し行わ行われ
(4)、SingleThreadExecutor(シングルスレッドのスレッドプール)
のエグゼキュータによってnewSingleThreadExecutor
作成は、特徴:
- のみコアスレッド、すべてのタスクが同じスレッドで順番に実行されます。
- 1つのスレッドにすべての外部タスクは、問題は、同期処理スレッドを必要としないようにします。
4、ThreadPoolExecutor紹介
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
パラメータ説明:
- corePoolSize:スレッドのコア数、スレッドプール、ケース内のデフォルトのコアのスレッドでも、アイドルで、スレッド・プールに生きていたでしょう。
- maximumPoolSize:スレッドの数は数に達していることを、新規雇用のフォローアップがブロックされるとき、スレッドプール内のスレッドの最大数は、保持することができます。
- keepAliveTimeが:非中核スレッドタイムアウト期間は、より多くのこの時間よりもタスクの実行は、非コアスレッドが回収されません。
- 単位: keepAliveTimeがパラメータを指定した時間の単位。
- ワークキュー:タスクキューのスレッドプール。
- threadFactory:スレッドファクトリは、新しいスレッドプールのスレッドを作成する機能を提供します。
-
ハンドラー:ハンドラーの種類のRejectedExecutionHandler。スレッドプールは、新しいタスクを実行することができない場合は、ハンドラの呼び出し、
rejectedExecution(Runnable r, ThreadPoolExecutor e)
例外をスローする方法を。
5、ThreadPoolExecutorは、タスクを実行し、一般的に次のルールに従います。
(1)プール内のスレッドの数は、カーネルスレッドの数に達しない場合は、直接タスクを実行するためにカーネルスレッドを開始します。
スレッドプール内のスレッドの数に達したか、カーネル・スレッドの数を超えている場合(2)、タスクは、実行のためにキューに入れられたタスクキューに挿入されます。
ステップ2は、タスクキューがいっぱいになる説明、新しいタスクを挿入することができない場合、スレッドの所定の最大数に達していない場合(3)、非コアタスクを実行するスレッドを開始。
(4)最大値は、ステップ3におけるスレッドの指定された数を超えた場合、その後のRejectedExecutionHandlerタスクおよび使用することを拒否したrejectedExecution(Runnable r, ThreadPoolExecutor e)
発信者に通知する方法。
オリジナルリンク:https://www.jianshu.com/p/56163a3beb4a
https://cloud.tencent.com/developer/article/1424838