スレッドの状態は、 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