Java如何監視執行緒的狀態?

2019-10-16 22:27:23

在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