マルチスレッド-並行プログラミング(4)-スレッドのステータスといくつかの一般的な方法の概要

スレッドの状態は、 Thread.getStateメソッドを介して取得できます(スレッドには6つの状態があります)

NEW(新規)新規:まだ開始されていません

RUNNABLE(実行可能状態)runnable: JVMで実行されている、またはオペレーティングシステムの他のリソース(プロセッサなど)を待機している

//有些编程语言会把RUNNABLE分成2种情况
//1.running
//2.ready
//以上2种在Java中都属于RUNNABLE

BLOCKED(ブロック状態)blocked:モニターロック(内部ロック)を待機中

WAITING(待機状態)待機中:別のスレッドを待機中
、次のメソッドを呼び出すと待機状態になります
Object.wait
タイムアウト値なしThread.joinLockSupport.parkタイムアウト値
なし
//後で詳しく説明します

TIMED_WAITING(時限待機状態)timed_waitingは、次の
メソッドを呼び出して時限待機状態にします
。Thread.sleep
にはタイムアウト値があります。Object.waitには
タイムアウト値があります


TERMINATED(終了状態):一部のインスタンスが実行されました:

public class Main {
	public static void main(String[] a) {
		Thread dangqian = Thread.currentThread();//获取主线程
		System.out.println(dangqian.getState());//输出RUNNABLE
		//表示主线程正处于RUNNABLE状态
		
		Thread tj = new Thread();//新建1个线程
		System.out.println(tj.getState());//输出NEW
		
		Thread tj1 = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("ACM");
			}
		});
		tj1.start();
		//启动执行完run方法后线程终止 此时处于TERMINATED状态
	}
}

睡眠割り込みの紹介

Thread.sleepメソッドを使用して現在のスレッドを一時停止し、WAITING状態に入ることができます。一時
停止期間中に、スレッドオブジェクトのinterruptメソッドが呼び出されてスレッドが中断されると、java.lang.InterruptedExceptionがスローされます。

例(注)の紹介はより明確です: 

public class Main {
	public static void main(String[] a) {
		Thread tj = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("1");
				try {
					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		//因为是多线程,在执行tj线程时,主线程依然往下走
		try {
			Thread.sleep(1000);//让主线程睡1s
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
		//由于tj线程睡得较久,所以先打印3,再打印2
		tj.interrupt();//中断此线程,但实际上只是给线程设置一个中断标志,线程仍会执行;在这里用于触发异常
	}
}
输出:
1
3
2

join isAlive
A.joinメソッドを導入します。スレッドAの実行が終了した後、現在のスレッドは引き続きタスクを実行します。パラメータを渡して、最長の待機時間を指定できます
。A.isAliveメソッド:スレッドAがまだ生きているかどうかを確認します

例:

public class Main {
	public static void main(String[] a) {
		Thread tj = new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("1");
				try {
					Thread.sleep(3000);//sleep是静态方法,所以通过类名来调用;让线程睡3s
				}catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("2");
			}
		});
		tj.start();
		System.out.println(tj.isAlive());//此时3s未过,tj线程仍在执行;所以输出true
		try {
			tj.join();//等tj线程执行完毕再往下执行
			//tj.join(1000); 等待tj线程1s再往下执行
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("3");
	    System.out.println(tj.getState());
	    System.out.println(tj.isAlive());//tj线程已执行完毕;所以输出false
	}
}
输出:
true
1
2
3
TERMINATED
false

おすすめ

転載: blog.csdn.net/weixin_59624686/article/details/124041842