Java isAlive()方法的作用

2020-07-16 10:04:37
isAlive() 方法的作用是判斷當前的執行緒是否處於活動狀態。什麼是活動狀態呢?活動狀態就是執行緒已經啟動且尚未終止。執行緒處於正在執行或準備開始執行的狀態,就認為執行緒是“存活”的。

例 1

下面通過一個案例來理解 isAlive() 方法判斷執行緒是否活動的標準。假設 MyThread08 執行緒類的程式碼如下:
package ch14;
public class MyThread08 extends Thread
{
    @Override 
    public void run()
    { 
        System.out.println("run="+this.isAlive()); 
    }
}

如上述程式碼所示,MyThread08 類的程式碼非常簡單,只是在 run() 方法中呼叫 isAlive() 方法輸出當前執行緒的活動狀態。

下面編寫啟動 MyThread08 執行緒的程式碼,具體實現如下:
package ch14;
public class Test11
{
    public static void main(String[] args)
    {
        MyThread08 mythread=new MyThread08();    //建立一個MyThread08執行緒範例
        System.out.println("begin=="+mythread.isAlive());    //輸出執行緒狀態
        mythread.start();    //啟動執行緒
        System.out.println("end=="+mythread.isAlive());    //輸出執行緒狀態
    }
}

執行後的輸出結果如下:
begin==false
end==true
run=true

在這裡需要注意如下一行程式碼:
System.out.println("end=="+mythread.isAlive());

雖然在本範例中這行語句輸出的值是 true,但此值是不確定的。輸出 true 值是因為 mythread 執行緒還未執行完畢,所以輸出 true。如果程式碼更改成如下形式:
package ch14;
public class Test11
{
    public static void main(String[] args) throws InterruptedException
    { 
        MyThread08 mythread=new MyThread08();    //建立一個MyThread08執行緒範例
        System.out.println("begin=="+mythread.isAlive());    //輸出執行緒狀態
        mythread.start();    //啟動執行緒
        Thread.sleep(1000);     //延時1000毫秒
        System.out.println("end=="+mythread.isAlive());    //輸出執行緒狀態
    }
}

再次執行主執行緒,此時的輸出結果如下:
begin==false
run=true
end==false

此時 end 的返回值為 false,這是因為 mythread 物件已經在 1 秒之內執行完畢。

例 2

在使用 isAlive() 方法時,如果將執行緒物件以構造引數的方式傳遞給 Thread 物件進行 start() 啟動,執行的結果和前面範例是有差異的。造成這樣的差異的原因還是來自於 Thread.currentThread() 和 this 的差異。下面通過一個案例來驗證這一點。

(1) 首先建立案例所使用的執行緒類,這裡命名為 MyThread09,具體程式碼如下:
package ch14;
public class MyThread09 extends Thread
{
    public MyThread09()
    {
        System.out.println("構造方法---開始");
        System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
        System.out.println("this.getName()="+this.getName());
        System.out.println("this.isAlive()="+this.isAlive());
        System.out.println("構造方法---結束");
    }
    @Override
    public void run()
    {
        System.out.println("run()方法---開始");
        System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
        System.out.println("this.getName()="+this.getName());
        System.out.println("this.isAlive()="+this.isAlive());
        System.out.println("run()方法---結束");
    }
}

(2) 接下來編寫主執行緒程式碼,建立 MyThread09 執行緒範例並啟動執行緒。程式碼如下:
package ch14;
public class Test12
{
    public static void main(String[] args)
    {
        MyThread09 mythread=new MyThread09();    //建立一個MyThread09執行緒範例
        Thread t1=new Thread(mythread);    //建立一個執行緒
        System.out.println("main begin t1 isAlive="+t1.isAlive());    //輸出執行緒狀態
        t1.setName("A");    //設定執行緒名稱
        t1.start();    //啟動執行緒
        System.out.println("main end t1 isAlive="+t1.isAlive());
    }
}

程式執行結果如下:
構造方法---開始
Thread.currentThread().getName()=main
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
構造方法---結束
main begin t1 isAlive=false
main end t1 isAlive=true
run()方法---開始
Thread.currentThread().getName()=A
Thread.currentThread().isAlive()=true
this.getName()=Thread-0
this.isAlive()=false
run()方法---結束