ホームページ  >  記事  >  Java  >  Java スレッドのステータスと一般的なメソッドの分析と例

Java スレッドのステータスと一般的なメソッドの分析と例

王林
王林転載
2023-04-21 13:04:081415ブラウズ

Thread.getState メソッドを通じてスレッドのステータスを取得できます (スレッドの状態は合計 6 つあります)

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

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

//一部のプログラミング言語では、RUNNABLE を 2 つの状況に分けます
//1.running
/ /2.ready
//上記の 2 つのタイプは Java ではすべて RUNNABLE です。

BLOCKED (ブロックされた状態) ブロックされています: モニター ロック (内部ロックを待機中) )

WAITING (待機状態)waiting: 別のスレッドを待機中

次のメソッドを呼び出すと待機状態になります

タイムアウト値なしのObject.wait

タイムアウト値なしのThread.join

LockSupport.park

//詳しくは後ほど紹介します

TIMED_WAITING(時間指定待ち状態) timed_waiting

次のメソッドを呼び出すと、時限待機状態になります

Thread.sleep

タイムアウト値付きのObject.wait

タイムアウト値付きのThread.join

LockSupport.parkNanos

LockSupport. parkUnti

//詳しくは後ほど紹介します

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 メソッドを使用して現在のスレッドを一時停止し、待機状態に入ることができます。

一時停止期間中に、スレッドの割り込みメソッドがオブジェクトがスレッドを中断するために呼び出される場合、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 がまだ生きているかどうかを確認します

#Instance:

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
	}
}

Output:

true
1

2
3
終了
false

以上がJava スレッドのステータスと一般的なメソッドの分析と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。