マルチスレッディングスレッドステート-中間進化04
糸の5つの状態
[外部リンク画像の転送に失敗しました。ソースサイトにアンチリーチリンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-FWyxsXWd-1600053055673)(/ Users / chenxiwen / Library / Application Support / typora-user-images / image-20200907092936502 .png)]
方法
setPriority:スレッドの優先度を変更する
睡眠
join:スレッドが終了するのを待ちます
yield:現在のスレッドを一時停止し、他のスレッドを最初に移動させます
isAlive:スレッドが生きているかどうかをテストします
スレッドストップ
フラグを使用してスレッド自体を停止させる
JDKが提供するstop()の使用は推奨されません
変数を設定するにはフラグを使用することをお勧めします。flag= falseの場合、スレッドは終了します。
public class TestStop implements Runnable{
private boolean flag = true;
@Override
public void run() {
int i = 0;
while (flag) {
System.out.println("线程"+i++);
}
}
public void stop() {
this.flag=false;
}
public static void main(String[] args) {
TestStop testStop = new TestStop();
new Thread(testStop).start();
for (int i = 0; i < 1000; i++) {
System.out.println("main"+i);
if (i == 900) {
testStop.stop();
System.out.println("stop");
}
}
}
}
スレッドスリープ
sleep(time)は、現在のスレッドがブロックされるミリ秒数を指定します
スリープに例外InterruptedExceptionがあります
スリープ時間に達した後、スレッドは準備完了状態になります
スリープは、ネットワーク遅延、カウントダウンなどをシミュレートできます。
すべてのオブジェクトにはロックがあり、スリープしてもロックは解除されません
public static void main(String[] args) {
try {
tendown();
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印当前系统时间
Date startTime = new Date(System.currentTimeMillis());
while (true) {
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
startTime = new Date(System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void tendown() throws InterruptedException {
int num =10;
while (true) {
Thread.sleep(1000);
System.out.println(num--);
if (num < 0) {
break;
}
}
}
スレッド礼儀収量
ポライトスレッド、現在実行中のスレッドを一時停止させますが、ブロックはしません
スレッドを実行状態から準備完了状態に変える
CPUのスケジュールを変更すると、CPUのムードによっては、礼儀正しさがうまくいかない場合があります
スレッドジャンプ結合
マージスレッドに参加し、2番目のスレッドの実行が完了するまで待機してから、他のスレッドを実行します。他のスレッドはブロックされます
列に並ぶように想像することができます
//join,插队
public class TestJoin implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("vip来了"+i);
}
}
public static void main(String[] args) throws InterruptedException {
TestJoin testJoin = new TestJoin();
Thread thred = new Thread(testJoin);
thred.start();
for (int i = 0; i < 1000; i++) {
if (i == 20) {
thred.join();
}
System.out.println("main"+i);
}
}
}
スレッド状態の観察
スレッドの状態
スレッドの状態:スレッドは次のいずれかの状態になります。
NEW
開始されていないスレッドはこの状態です。RUNNABLE
Java仮想マシンで実行されているスレッドはこの状態です。BLOCKED
モニターロックを待機してブロックされているスレッドは、この状態です。WAITING
別のスレッドが特定のアクションを実行するのを待っているスレッドは、この状態です。TIMED_WAITING
別のスレッドが指定された待機時間の間アクションを実行するのを待っているスレッドは、この状態にあります。TERMINATED
終了したスレッドはこの状態です。
public class TestState {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread.State state = thread.getState();
System.out.println(state);
thread.start();
state = thread.getState();
System.out.println(state);
while (state != Thread.State.TERMINATED) {
Thread.sleep(100);
state = thread.getState();
System.out.println(state);
}
}
}
スレッドの優先順位
Javaには、起動後に準備状態になるプログラム内のすべてのスレッドを監視するスレッドスケジューラが用意されています。スレッドスケジューラは、優先順位に従って、最初に実行するようにスケジュールするスレッドを決定します。
優先度は1〜10の範囲の数値で表されます
Thread.MIN_PRIORITY = 1;
Thread.MAX_PRIORITY = 10;
Thread.NORM_PRIORITY = 5;
優先順位を変更または取得する
getPriority、setPriority(int i)
プライオリティ設定は、start()でお金をスケジュールするために推奨されます
低い優先順位は、スケジューリングの確率が低いことを意味するだけで、呼び出されないことはありません。または、CPUのスケジューリングに依存しています。
デーモン
スレッドはユーザースレッドとデーモンスレッドに分けられます
仮想マシンは、ユーザースレッドが実行を完了することを確認する必要があります。
仮想マシンは、デーモンスレッドの実行が完了するのを待つ必要はありません。
バックグラウンドでの操作ログの記録、メモリの監視、ガベージコレクションの待機など
setDaemon(true);