Android マルチスレッド プログラミング

1. プロセスとスレッドの概念 プロセス
: プログラムの実行をプロセスと呼びます. 各プロセスは独立したコードとデータ空間を持ちます. プロセス間の切り替えのオーバーヘッドは比較的大きくなります. プロセスには 1-n のスレッドが含まれます. プロセスは、リソース共有の最小単位です。

スレッド: 同じタイプのスレッドがコードとデータ空間を共有します. 各スレッドには独立した実行スタックとプログラム カウンター (PC) があります. スレッド切り替えのオーバーヘッドは小さいです. スレッドは CPU スケジューリングの最小単位です.

マルチプロセス: 同時に複数のタスク (プログラム) を実行できるオペレーティング システムを指します。

マルチスレッド: 同じプログラム内で複数のシーケンス フローを実行することを指し、スレッドはプロセス内の単一の制御シーケンス フローです。

プロセスと同様に、スレッドには、作成、準備完了、実行中、ブロック、および破棄の 5 つの状態があります。
1. 新しい状態 (New): スレッド オブジェクトが新しく作成されます。
2. Ready 状態 (Runnable): スレッド オブジェクトが作成された後、他のスレッドがオブジェクトの start() メソッドを呼び出します。この状態のスレッドは、実行可能なスレッド プールに配置され、実行可能になり、CPU の使用権を取得するために待機します。
3. 実行中状態 (Running): 準備完了状態のスレッドが CPU を獲得し、プログラム コードを実行します。
4. ブロック状態 (Blocked): ブロック状態とは、スレッドが何らかの理由で CPU の使用権を放棄し、一時的に実行を停止することを意味します。スレッドが準備完了状態になるまで、実行状態に移行する機会があります。ブロッキングには 3 つのタイプがあります。
(1) ブロッキングの待機: 実行中のスレッドが wait() メソッドを実行し、JVM がそのスレッドを待機プールに入れます。(待機は保持されたロックを解放します)
(2) 同期ブロッキング: 実行中のスレッドがオブジェクトの同期ロックを取得すると、同期ロックが他のスレッドによって占有されている場合、JVM はそのスレッドをロック プールに入れます。
(3) その他のブロッキング: 実行中のスレッドが sleep() または join() メソッドを実行する場合、または I/O 要求が発行される場合、JVM はスレッドをブロック状態にします。sleep() 状態がタイムアウトすると、join() がスレッドの終了またはタイムアウトを待つか、I/O 処理が完了すると、スレッドは再び Ready 状態に移行します。(sleep は保持されたロックを解放しないことに注意してください
)

第二に、マルチスレッドの利点
シングルスレッドの特徴は、キュー実行、つまり同期です。ただし、マルチスレッドを使用すると、CPU のアイドル時間を最大限に活用して他のタスクを処理できるため、システムの動作効率が大幅に向上します。

3. マルチスレッドの使用 マルチスレッド
プログラミングを実装するには、主に 2 つの方法があります。1 つは Thread クラスを継承する方法で、もう 1 つは Runable インターフェイスを実装する方法です。実際、Thread クラスを継承して新しいスレッドを作成する場合、最大の制限は多重継承をサポートしていないことです。Java 言語の特性は単一ルート継承であるため、多重継承をサポートするには、次のように実装できます。 Runnable インターフェースを実装し、継承します。しかし、この2つの方法で作られる糸の性質は同じであり、本質的な違いはありません。

1. マルチスレッドを使用して
ユーザー エクスペリエンスを向上させ、ANR を回避する理由、
イベントを非同期的に処理する (たとえば、ネットワーク上で画像を表示する場合、最初にプレースホルダー画像を表示し、次に画像が読み込まれた後に画像を表示する)、マルチタスク (たとえば
、音楽アプリは、再生、歌詞表示、リスト表示、その他の機能をサポートできます);

イベント処理の原則: 時間のかかる可能性のあるタスクはすべて非メイン スレッドで処理されます。Android
メイン スレッドには、UI 描画、イベント処理の制御、一般的に言えば、コード内の on の始まりはメイン スレッドに属するタスクです。 onCreate()、onClick() など; 一般的に言えば、Activity ライフサイクルの onCreate(); onStart(); onResume() の実行時間によって、APP を開く応答速度が決まります。処理に時間のかかる操作がある場合は、他のスレッドに入れてみてください。

Android マルチスレッドの実装には、次のものが含まれます。

1. 基本的な使用方法
Inherit Thread クラスを
使用して Runnable インターフェイス
Handlerを実装する
2. 複合的な使用方法
AsyncTask
HandlerThread
IntentService
3. 高度な使用方法
Thread Pool (ThreadPool)

Java マルチスレッド プログラミング コア技術 (1) – マルチスレッド スキル
1、プロセスとスレッドの概念

1. プロセス: プロセスは、オペレーティング システムの基本です. プログラムの実行です. プログラムとそのデータがプロセッサ上で順次実行されるときに発生するアクティビティです. 上で実行されているプログラムのプロセスです.データセット. システムのリソース. 割り当てとスケジューリングの独立した単位.

2. スレッド: スレッドは、プロセス内で独立して実行されるサブタスクとして理解できます. スレッドは、1 つのプロセスにのみ属することができ、そのプロセスが所有するリソースにのみアクセスできます.

2. マルチスレッドプログラミングの実現方法

1. Thread クラスを継承する. ソース コードの実装に関しては、このクラスは Runnable インターフェイスも実装します. このクラスを使用する最大の制限は、java が多重継承をサポートしていないことです.

2. Runnable インターフェイスを実装します。

3. よく使われる API

1. currentThread(): コード セグメントが呼び出されているスレッドに関する情報を返します。

2. isAlive(): 現在のスレッドがアクティブかどうかを判断します。

3. sleep(): 現在のスレッドがスリープします。

4. getId(): 現在のスレッドの一意の ID を取得します。

4. マルチスレッド方式

4.1、currentThread()方法

currentThread() メソッドは、コード セグメントが呼び出されているスレッドに関する情報を返します。

Thread.currentThread().getName()

4.2、isAlive()方法

メソッド isAlive() の機能は、現在のスレッドがアクティブかどうかを判断することです。

thread.isAlive();

4.3、sleep() メソッド

メソッド sleep() の機能は、指定されたミリ秒数内で現在の「実行中のスレッド」をスリープ (実行を一時停止) することです。この「実行中のスレッド」とは、this.currentThread() によって返されるスレッドを指します。

Thread.sleep()

4.4、getId() メソッド

getId() メソッドの機能は、スレッドの一意の識別子を取得することです。

スレッド.getId()

4. 実行中のスレッドを停止する方法

1. exit フラグを使用すると、スレッドが正常に終了します。つまり、run メソッドが完了した後にスレッドが終了します。

2. stop メソッドを使用してスレッドを強制終了する この方法は、stop、suspend、および resume メソッドがすべて無効で期限切れのメソッドであり、これらを使用すると予期しない結果が生じるため、推奨されません。

3. interrupt メソッドを使用して、スレッドを中断します。

5.中断方法と再開方法

1.suspend(): スレッドを一時停止する

2. resume(): 中断されたスレッドの実行を再開する

短所: これら 2 つのメソッドを不適切に使用すると、パブリック同期メソッドが簡単に独占され、他のスレッドにアクセスできなくなります。スレッドの停止によりデータが同期しない場合もあります

6. yield(): このメソッドの機能は、現在の CPU リソースを放棄し、他のタスクに渡して CPU の実行時間を占有することですが、放棄する時間は不確実であり、CPU 時間を取得することが可能です。あきらめた直後にスライス。

7. スレッドの優先度

1. オペレーティング システムでは、スレッドに優先順位を付けることができ、優先順位の高いスレッドはより多くの CPU リソースを取得します。つまり、CPU は優先順位の高いスレッド オブジェクトのタスクを最初に実行します。Java では、スレッドの優先度は 1 から 10 までの 10 段階に分けられます。超えた場合、例外がスローされます

2. スレッドの優先度の継承: Java では、スレッドの優先度が継承されます.たとえば、スレッド A はスレッド B を開始し、スレッド B はスレッド A と同じ優先度になります.

3. 優先度は規則的でランダムです: 優先度の高いスレッドのほとんどが常に最初に実行されますが、優先度の高いスレッドが常に最初に実行されるという意味ではありません。

8. デーモン スレッド: Java スレッドには 2 種類のスレッドがあり、1 つはユーザー スレッドです。1 つはデーモン スレッドで、デーモン スレッドは特殊なスレッドであり、プロセス内に非デーモン スレッドが存在しない場合、デーモン スレッドは自動的に破棄されます。典型的なデーモン スレッドはガベージ コレクション スレッドです。

Java マルチスレッド プログラミング コア技術 (1) Java マルチスレッド スキル トピック
:

この一連の記事は、主に本の内容を自分で消化し、核となる内容と重要なポイントをピックアップすることを目的としています。読者は、この本の内容を理解するのに最小限の時間を費やすことができます。

   第一章主要讲解多线程的概念,使用方法,一些基本的api;每小节的内容不超过十句话的总结如下:

階層的には次のとおりです。

1.1 プロセスとマルチスレッドの概念。

1. プロセスはコンピュータの実行プログラムとして理解でき、スレッドはプロセス内で独立して実行されるサブタスクとして理解できます。

2. マルチスレッド化により、システムの CPU 使用率が増加し、操作効率が向上します。

3. マルチスレッドは非同期であり、実行の順序はコードの順序ではありません

1.2 マルチスレッドの使い方;

1. Thread クラスを継承し、MyThread が Thread を拡張する、Myrunalble が Runable を実装するなどの Runable インターフェースを実装する

2. Thread クラス自体も実行可能なインターフェースを実装します

3. start メソッドは「Thread Planner」に準備が整ったことを通知し、run メソッドの呼び出しを待機します. run を直接呼び出した場合は、開始が非同期ではないことを意味します。

4. Thread のコンストラクターは、Thread a = new Thread(new Runable()); などの Runable インターフェイスで渡すことができます。

5. 変数インスタンスは、共有ポイントと非共有ポイントに分けられます. 共有された変更は、スレッド同期の問題によりデータの違いを引き起こす可能性があり、synchronized キーワードを使用する必要があります;

6. printIn() メソッドでは、このメソッドは同期的ですが、i– の操作は printIn() の前に発生します。そのため、スレッドセーフではない問題が発生する可能性があります。

1.3 currentThread メソッド

1.Thread.currentThread().getName();

2.this.getTime()

1.4isAlive方法

1. アクティブな状態とは、スレッドが開始され終了していない状態で、スレッドが実行中または実行を開始する準備ができていることを意味します。この時点で、スレッドは生きていると見なされます。

2.Mythread.isAlive();

1.5スリープ方式

1. 現在のスレッドをスリープ状態にする (実行を一時停止する)

1.6 getID メソッド

1. スレッドの一意の識別子を取得する

1.7 スレッドを停止する

1. タスクを終了する前に、実行中の操作を停止します。

2. すぐに停止するには stop を使用しますが、推奨されません (安全ではありません); Thread.interrupt を使用することをお勧めします; このメソッドは実行中のスレッドを終了せず、停止と判断する必要があります。

3.interrupt は、スレッドの停止をマークするだけです。本当に止まりません。

4.this.interrupted(); 現在のスレッドが中断されたかどうかをテストします。状態をクリアします。this.isInterrupted(); スレッド スレッドが中断されたかどうかをテストします

5. スレッドを終了するための推奨される方法。this.interrupted()。例外を手動で作成してから、例外キャプチャを使用します。

6. スレッドがスリープ状態で停止すると、例外が発生します

7. スレッドの停止によって一部のクリーニング作業が完了せず、ロックされたオブジェクトのロックが解除されてデータの不整合が発生する可能性があるため、停止メソッドは推奨されません。

1.8 スレッドの中断

1. suspend を使用してスレッドを中断し、resume を使用してスレッドの実行を再開できます。

2. sync キーワードが追加されている場合、中断後にスレッドが再開されないため、パブリック リソースにアクセスできなくなる可能性があります。キーワードは追加されません。一時停止後にデータの不整合が発生する可能性があります

1.9利回り法

1. 現在の CPU リソースを放棄し、他のタスクに CPU を占有させます。

2.Thread.yield();

1.10 スレッド優先度

1. setPriority() を使用してスレッドを設定できます Java では、スレッドは 1 ~ 10 のレベルに分けられます。

2. 優先度は継承可能です。スレッド a によって開始されたスレッド b の場合、b のスレッドは a のスレッドと同じ優先度を持ちます。

3. CPU は優先度の高いスレッドにリソースを割り当てます

4. 優先度はランダムで、優先度の高いものが毎回最初に実行されるとは限りません。

1.11 デーモンスレッド

1. スレッドには、ユーザー スレッドとデーモン スレッドの 2 種類があります。

2. デーモン スレッドは非デーモン スレッドをガードします 非デーモン スレッドが存在しない場合、デーモン スレッド フィールドは破棄されます

3. 典型的なデーモン スレッドはガベージ コレクション スレッドです。

要約:

メインの学習スレッド API

参考:
https://www.cnblogs.com/jmcui/p/7486257.html
https://www.cnblogs.com/umgsai/p/5494561.html
https://blog.csdn.net/qq_41648631/article/details/103045252

おすすめ

転載: blog.csdn.net/weixin_44008788/article/details/107824279