スレッド知識ポイントのまとめ
5839 ワード
知識は何ですか.知識は本を読んで本を捨てた後、頭の中ではっきりしていて、正確で、必要な概念です.
以前はスレッドに関するブログもたくさん書いていましたが、自分の基礎がしっかりしていないので、他人のものを抜粋していることが多いです.だからこの文章はいくつかの重要な概念を総括して、知識をまとめて整理して、このブログは長期にわたって更新して、いくつかの自分が分からないで重要な理論に出会ったら追加します.
フロントプロセス、表示プロセス、サービスプロセス、バックグラウンドプロセス、空のプロセス
1、フロントプロセス(Foreground process)
ユーザーと対話中のActivity
プロセスは、1サービスがユーザーと対話中のActivityにバインドされているサービスを持っています.②サービスはフロントで実行され、startForeground()が呼び出されます.③サービスは、ライフサイクルコールバック関数(onCreate()、onStart()、or onDestroy()を実行しています.
プロセスには、onReceive()メソッドを実行しているBroadcastReceiverがあります.
2、可視プロセス(Visible process)
プロセスにはActivityがあります.このActivityはフロントにありませんが、onPause()呼び出し後にonStop()が呼び出されていない状態がユーザーに表示されます.たとえば、フロントのactivityがダイアログボックスを開き、activityが後で表示されます.
プロセスは、表示される(またはフロントの)Activityにバインドされたサービスを持っています.
3、サービスプロセス(サービスプロセス)
プロセスでサービスが実行されている場合、このサービスはstartService()によって開かれ、上記の2つの優先度が高くない場合、このプロセスはサービスプロセスです.
サービスでスレッドを新たに起動して画像ファイルをアップロードするには、ユーザーがactivityを離れたときも作業が進行するようにサービスを開いてアップロード作業を行う必要があります.
4、バックグラウンドプロセス(Background process)
プロセスは、ユーザが見えないactivity(activityのonStop()が呼び出されたが、onDestroy()が呼び出されていない状態)を持ち、プロセスがバックグラウンドプロセスであるとみなされる.
バックグラウンドで音楽を再生したり、バックグラウンドでデータをダウンロードしたりします.
Activityで新しいスレッドを直接開いて時間のかかる操作を行い、Activityがデスクトップまたはその他の状況に終了すると
5、空のプロセス
1つのプロセスには、アクティブなアプリケーションコンポーネントは含まれません.
1つのプロセスではデータが実行されていませんが、メモリにはこのアプリケーションのためにプロセススペースが1つ存在します.
1、属性priorityの最高優先度を設定し、1000は最高値である
2、onStartCommandでstartForeground()メソッドを呼び出してServiceをフロントプロセスレベルに昇格させる
3、onStartCommandメソッド、START_に戻るSTICKY
4、onDestroy方法で放送してサービスを再起動する
5、傍受システム放送判断サービス状態
6、このプロセスを常駐メモリプロセスに設定する:Android Manifestのアプリケーションにandroid:persistent=“true”を追加する
Thread、AsyncTask、HandlerThread、IntentService、ThreadExecutor
画像の処理、リソースファイルの読み取り、データベースの読み書きなど、サブスレッドを簡単に開きます.起動と終了を手動で制御しないと、プログラムが終了してもバックグラウンドで実行されます.
インタフェースと頻繁にやり取りするのに適しています.例えば、進捗バー、Threadでできることもできます.
フロントでのマルチスレッドシリアル処理に適したプログラム
バックグラウンドで実行するマルチスレッドシリアルプログラムの処理に適しています
音楽ダウンロード、画像ロード(ImageLoader)など、スレッドを繰り返し使用するのに適したプログラム
1、サブスレッド作成Handler
1、同時操作コードを実行する:
submit内部コールexecute submit戻り値 submit便利exception処理 Callableのcall()メソッドはRunnableのrun()メソッドに似ています.前者には戻り値があり、後者にはありません. の両方は、インスタンスが別のスレッドによって実行される可能性があるクラスのために設計されている. しかし、Runnableは結果を返さず、検査された異常を投げ出すことができません.
newFixedThreadPool固定数 newSingleThreadExecutorシリアル newCachedThreadPool無限大 newScheduledThreadPool固定数、周期的実行 ArrayBlockingQueue:配列構造のブロックキュー LinkedBlockingQueue:チェーンテーブル構造のブロックキュー PriorityBlockingQueue:優先順位のあるブロックキュー SynchronousQueue:要素が格納されないブロックキュー
AbortPolicy:デフォルトの実装では、RejectedExecutionException例外を直接投げ出し、呼び出し元が自分で処理できるようにします.
DiscardPolicy:キューがいっぱいになったら、後続のタスクは捨てます.
DiscardOldestPolicy:待ち行列の中で最も古いタスクを蹴って、新しいタスクを実行させます.
CallerRunsPolicy:新しいタスクも古いタスクも捨てず、現在のスレッドで直接このタスクを実行します.
スレッドプールが新しいスレッドを作成する必要があるたびに、スレッドファクトリで取得されます.ThreadPoolExecutorにスレッドファクトリを設定しない場合は、デフォルトのdefaultThreadFactoryが使用されます.
スレッドプール内のスレッドのnameを通常印刷するとpool-1-thread-1のような名前が出力されますが、ここで設定します.このデフォルトのスレッドファクトリでは、作成されたスレッドは通常の非デーモンスレッドであり、カスタマイズが必要な場合は、ThreadFactoryを実装した後、ThreadPoolExecutorに転送すればよい.
以前はスレッドに関するブログもたくさん書いていましたが、自分の基礎がしっかりしていないので、他人のものを抜粋していることが多いです.だからこの文章はいくつかの重要な概念を総括して、知識をまとめて整理して、このブログは長期にわたって更新して、いくつかの自分が分からないで重要な理論に出会ったら追加します.
プロセス優先度の5種類:
フロントプロセス、表示プロセス、サービスプロセス、バックグラウンドプロセス、空のプロセス
1、フロントプロセス(Foreground process)
ユーザーと対話中のActivity
プロセスは、1サービスがユーザーと対話中のActivityにバインドされているサービスを持っています.②サービスはフロントで実行され、startForeground()が呼び出されます.③サービスは、ライフサイクルコールバック関数(onCreate()、onStart()、or onDestroy()を実行しています.
プロセスには、onReceive()メソッドを実行しているBroadcastReceiverがあります.
2、可視プロセス(Visible process)
プロセスにはActivityがあります.このActivityはフロントにありませんが、onPause()呼び出し後にonStop()が呼び出されていない状態がユーザーに表示されます.たとえば、フロントのactivityがダイアログボックスを開き、activityが後で表示されます.
プロセスは、表示される(またはフロントの)Activityにバインドされたサービスを持っています.
3、サービスプロセス(サービスプロセス)
プロセスでサービスが実行されている場合、このサービスはstartService()によって開かれ、上記の2つの優先度が高くない場合、このプロセスはサービスプロセスです.
サービスでスレッドを新たに起動して画像ファイルをアップロードするには、ユーザーがactivityを離れたときも作業が進行するようにサービスを開いてアップロード作業を行う必要があります.
4、バックグラウンドプロセス(Background process)
プロセスは、ユーザが見えないactivity(activityのonStop()が呼び出されたが、onDestroy()が呼び出されていない状態)を持ち、プロセスがバックグラウンドプロセスであるとみなされる.
バックグラウンドで音楽を再生したり、バックグラウンドでデータをダウンロードしたりします.
Activityで新しいスレッドを直接開いて時間のかかる操作を行い、Activityがデスクトップまたはその他の状況に終了すると
5、空のプロセス
1つのプロセスには、アクティブなアプリケーションコンポーネントは含まれません.
1つのプロセスではデータが実行されていませんが、メモリにはこのアプリケーションのためにプロセススペースが1つ存在します.
サービスの優先順位を上げる方法
1、属性priorityの最高優先度を設定し、1000は最高値である
2、onStartCommandでstartForeground()メソッドを呼び出してServiceをフロントプロセスレベルに昇格させる
3、onStartCommandメソッド、START_に戻るSTICKY
public int onStartCommand(Intent intent, int flags, int startId) {
flags = START_STICKY;
returnsuper.onStartCommand(intent, flags, startId);
}
4、onDestroy方法で放送してサービスを再起動する
5、傍受システム放送判断サービス状態
6、このプロセスを常駐メモリプロセスに設定する:Android Manifestのアプリケーションにandroid:persistent=“true”を追加する
サブスレッドを開く方法
Thread、AsyncTask、HandlerThread、IntentService、ThreadExecutor
1、Thread
画像の処理、リソースファイルの読み取り、データベースの読み書きなど、サブスレッドを簡単に開きます.起動と終了を手動で制御しないと、プログラムが終了してもバックグラウンドで実行されます.
2、AsyncTask
インタフェースと頻繁にやり取りするのに適しています.例えば、進捗バー、Threadでできることもできます.
3、HandlerThread
フロントでのマルチスレッドシリアル処理に適したプログラム
4、IntentService
バックグラウンドで実行するマルチスレッドシリアルプログラムの処理に適しています
5、ThreadExecutor
音楽ダウンロード、画像ロード(ImageLoader)など、スレッドを繰り返し使用するのに適したプログラム
Thread
1、サブスレッド作成Handler
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(Message msg) {
mTextView.setText(" ");
}
};
Looper.loop();
handler.sendEmptyMessage(123);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
AsyncTask
1、同時操作コードを実行する:
loadImageAsyncTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, path);
HandlerThread
IntentService
ThreadExecutor
executeとsubmitの違い
CallableとRunnableの違い
あらかじめ設定されたスレッドプール
BlockingQueue待ち行列
ほうわせんりゃく
AbortPolicy:デフォルトの実装では、RejectedExecutionException例外を直接投げ出し、呼び出し元が自分で処理できるようにします.
DiscardPolicy:キューがいっぱいになったら、後続のタスクは捨てます.
DiscardOldestPolicy:待ち行列の中で最も古いタスクを蹴って、新しいタスクを実行させます.
CallerRunsPolicy:新しいタスクも古いタスクも捨てず、現在のスレッドで直接このタスクを実行します.
ThreadFactory
スレッドプールが新しいスレッドを作成する必要があるたびに、スレッドファクトリで取得されます.ThreadPoolExecutorにスレッドファクトリを設定しない場合は、デフォルトのdefaultThreadFactoryが使用されます.
スレッドプール内のスレッドのnameを通常印刷するとpool-1-thread-1のような名前が出力されますが、ここで設定します.このデフォルトのスレッドファクトリでは、作成されたスレッドは通常の非デーモンスレッドであり、カスタマイズが必要な場合は、ThreadFactoryを実装した後、ThreadPoolExecutorに転送すればよい.