C語言中文網 目錄

Java isAlive()方法的作用

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

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户