在Java程式設計中,如何監視執行緒的狀態?
以下範例演示如何通過擴充套件Thread
類並使用currentThread.getName()
方法來監視執行緒的狀態。
package com.yiibai;
class MyThread2 extends Thread {
boolean waiting = true;
boolean ready = false;
MyThread2() {
}
public void run() {
String thrdName = Thread.currentThread().getName();
System.out.println(thrdName + " starting.");
while (waiting)
System.out.println("waiting:" + waiting);
System.out.println("waiting...");
startWait();
try {
Thread.sleep(1000);
} catch (Exception exc) {
System.out.println(thrdName + " interrupted.");
}
System.out.println(thrdName + " terminating.");
}
synchronized void startWait() {
try {
while (!ready)
wait();
} catch (InterruptedException exc) {
System.out.println("wait() interrupted");
}
}
synchronized void notice() {
ready = true;
notify();
}
}
public class MonitoringThread {
public static void main(String args[]) throws Exception {
MyThread2 thrd = new MyThread2();
thrd.setName("MyThread #1");
showThreadStatus(thrd);
thrd.start();
Thread.sleep(50);
showThreadStatus(thrd);
thrd.waiting = false;
Thread.sleep(50);
showThreadStatus(thrd);
thrd.notice();
Thread.sleep(50);
showThreadStatus(thrd);
while (thrd.isAlive())
System.out.println("alive");
showThreadStatus(thrd);
}
static void showThreadStatus(Thread thrd) {
System.out.println(thrd.getName() + " Alive:=" + thrd.isAlive() + " State:=" + thrd.getState());
}
}
上述程式碼範例將產生以下結果 -
alive
alive
alive
alive
alive
............. 省略了一大波資料 ...............
alive
alive
MyThread #1 terminating.
alive
alive
alive
alive
alive
alive
alive
MyThread #1 Alive:=false State:=TERMINATED