マルチスレッドの基本的な研究ノート
マルチスレッドを理解する
プロセスとスレッド
プロセスはコンピューター上のプログラムであり、スレッドは
プロセスの実行ユニットです。プロセスには多くのスレッド、ヒープ、およびメソッド領域があり、スレッドには独自のスタック、プログラムカウンター、およびローカルメソッドスタックがあります。
並行性と並列性
並行性:複数のタスクが
同時に実行されます並列:複数のタスクが同時に実行されます
マルチスレッドを使用する理由
シングルプロセッサ:io操作とcpu操作を同時に実行することはできません。マルチスレッドはプログラム操作の効率を向上させることができます
マルチプロセッサ:シングルスレッドを使用すると、すべてのcpu
サーバーを同時に使用することはできません:複数のユーザーに応答する必要があります同時にリクエスト
マルチスレッドを使用するときに対処する必要のある問題
1、スレッドセーフ
2、デッドロック
3、メモリリーク
マルチスレッド実装
Threadクラスを継承します
1. Threadサブクラスを
作成し、runメソッドを書き直します。2。サブクラスのインスタンスオブジェクトを作成し、startメソッドを呼び出し
ます。機能:Javaは1つの親クラスのみを継承できます。
runメソッドを直接使用してみませんか
runを実行すると、内部のコードのみを実行でき、startはスレッドを開始できます
Runnableインターフェースを実装する
1. Runnableインターフェイスサブクラスのインスタンスオブジェクトを構築し、runメソッドを書き直し
ます2.サブクラスのインスタンスオブジェクトを作成します
3.パラメータ化されたThread構築メソッドを呼び出し、startメソッドを呼び出し
ます機能:Javaは複数のインターフェイスを実装でき、単一の継承
共有リソースのより良い処理
Callableインターフェースを実装する
1. Callableインターフェイスサブクラス
のインスタンスオブジェクトを作成し、callメソッドを書き直します2.サブクラスのインスタンスオブジェクトを作成します
3.パラメーター化されたFutureTask構築メソッドを
呼び出します4.パラメーター化されたThread構築メソッドを呼び出し、startメソッドを呼び出し
ます機能:戻り値、例外をスローするように宣言可能
コード:
public class Test2 {
public static void main(String[] args) throws InterruptedException, ExecutionException {
Thread1 t1 = new Thread1();
t1.start();
Thread2 t2 = new Thread2();
new Thread(t2).start();
Thread3 t3 = new Thread3();
FutureTask<Object> f = new FutureTask<>(t3);
Thread t = new Thread(f);
t.start();
System.out.println(f.get());
}
}
class Thread1 extends Thread{
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
class Thread2 implements Runnable{
public void run() {
for(int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
}
}
class Thread3 implements Callable<Object>{
public Object call() throws Exception {
// TODO Auto-generated method stub
for(int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + i);
}
return 10;
}
}
スレッドのライフサイクル
新着
オブジェクトが作成されたとき
実行可能
startメソッドを呼び出すと、操作可能になります。
準備完了と実行に分けられます。
ブロック
一般
にロックに関連します。ブロックは、ロックの取得を待機している
ときに発生します。IO要求が発行されたときにも発生します。
待つ
パラメータなしでjoin、wait、およびその他のメソッドを使用すると、待機が発生します。
他のスレッドがnotifyおよびnotifyAllを使用すると、スレッドの準備が整います。
時限待機
スリープ、待機、およびパラメータとの結合を使用して定期的に待機します。
他のスレッドがnotifyおよびnotifyAllを使用した後、スレッド
は準備完了状態になります。時間が経過すると、スレッドも準備完了状態になります。
死
実行が完了するか、例外がスローされると、エラーが発生する
とスレッドが終了し、終了後に他の状態に入ることができなくなります
スレッドスケジューリング
プリエンプティブスケジューリング:優先度に従ってCPUリソースを探します。
タイミングスケジューリング:スレッドはタイミングサイズのタイムスライスを取得して実行します。
優先度
優先度が高いとCPUリソースを簡単に取得でき、
優先度は1〜10の
優先度の変更に分割されます。setPriorityメソッドを使用します。
租界
スレッドは準備完了状態になり、CPUリソースを放棄します。yield
メソッドを使用します。
休眠
スレッドをスリープ状態にするためにsleepメソッドを使用する
並んでジャンプ
スレッドはBスレッドに挿入されますが、Aが実行を終了した場合にのみ、B
は結合メソッドを使用できます。
舞台裏
スレッドはフォアグラウンドとバックグラウンドに分けられます。デフォルトではフォアグラウンドです。
フォアグラウンドスレッドはすべて終了し、プログラムは終了します
。startメソッドを使用する前に、setDeamonメソッドを使用する必要があります。
マルチスレッド同期
スレッドセーフ
遅延があると、データベースと同様にセキュリティ上の問題が発生します
同期コードブロック
同期メソッドを使用してオブジェクトをロックすると、次のコードブロックが同期されます
オブジェクトは任意ですが、同じである必要があります。タグ値は、コードブロックが実行されていない場合は1、使用されている場合は0です。0の場合、他のスレッドはコードブロックを実行できません。
同期方法
同期された変更されたメソッド、変更されたメソッドは同期されます
メソッドがロックされているときにロックされているオブジェクトは、メソッドを呼び出したオブジェクトです
同期静的メソッド
オブジェクトは作成されません。同期された静的メソッドのロックは、メソッドのクラスオブジェクトです。
同期のデメリット:各スレッド呼び出しでロックタグの値を決定する必要があるため、
多くの時間がかかります。スレッドは、ロックが取得されるまで待機する必要があります。
同期ロック
LockインターフェースとReentrantLock実装クラスを使用してロックを構築し、lockメソッドとunlockメソッドを使用してスレッドの同期を実現します。
通常、unlockメソッドはfinallyで記述されます。
スレッドがロックの適用に複数回失敗した後、スレッドは待機しなくなり、より柔軟になります
マルチスレッド通信
待機とスリープの違い:
sleepのユーザーはスレッドであり、waitが使用するオブジェクトは同期ロックオブジェクトです
。Waitはロックオブジェクトを破棄します。Sleepはあきらめません
。waitスレッドは自動的にウェイクアップしません。notifyとnotifyAllが必要です。sleepメソッド(およびパラメーターで待機)が実行された後、スレッドは自動的にウェイクアップします。
notifyとnotifyAllの違い
Notifyは同期ロックの最初の待機中のスレッド(waitを呼び出す最初のスレッド)をウェイクアップし、notifyAllはすべての待機中のスレッドをウェイクアップします