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()方法---結束