Java多線程問題--線程對象以構造參數的方式傳遞給Thread對象進行start()啓動時的差異

本文內容部分引自《Java多線程編程核心技術》,感謝作者!!!

代碼地址:https://github.com/xianzhixianzhixian/thread.git

前幾天看書,有很多疑惑,於是把自己的感悟記錄下來。那麼,線程對象以構造參數的方式傳遞給Thread對象進行start()啓動和直接啓動時的差異是什麼呢?

劃重點了,先看對比圖,第一張是直接啓動時的結果,第二張是作爲參數時的結果。

圖一

圖二

直接啓動時的,線程到run()函數裏的isAlive變爲true了;而作爲參數時,不管什麼時候,this.isAlive都是false;那麼原因是什麼呢?咱們繼續看代碼,先看線程類的代碼CountOperate.java,這個代碼前後通用。

/**
 * 舉例說明線程對象以構造參數的方式傳遞給Thread對象進行start()啓動時的差異
 * @author: xianzhixianzhixian
 * @date: 2018/11/6 7:25 PM
 */
public class CountOperate extends Thread {

    public CountOperate(){
        System.out.println("CountOperate---begin");
        System.out.println("Thread.currentThread().getName()="+Thread.currentThread().getName());
        System.out.println("Thread.currentThread().isAlive()="+Thread.currentThread().isAlive());
        //當線程對象以構造參數的方式傳遞給Thread對象進行start()啓動時,注意這裏的this和Thread.currentThread()的不同
        System.out.println("this.getName()="+this.getName());
        System.out.println("this.isAlive()="+this.isAlive());
        System.out.println("CountOperate---end");
    }

    @Override
    public void run() {
        super.run();
        System.out.println("run---begin");
        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---end");
    }
}

圖一  Run.java代碼,當線程對象不作爲參數啓動時,CountOperate中的this就是CountOperate類new出來的實例。由於其已經啓動,所以this.isAlive爲true

/**
 * @author: xianzhixianzhixian
 * @date: 2018/11/6 7:35 PM
 */
public class Run {

    public static void main(String[] args){
        CountOperate c = new CountOperate();
        System.out.println("main start t isAlive="+c.isAlive());
        c.start();
        System.out.println("main end t isAlive="+c.isAlive());
    }
}

圖二 Run.java代碼,當線程對象作爲參數啓動時,CountOperate中的this也是CountOperate類new出來的實例,

但在main函數中啓動的只是線程t的實例而不是c的實例,所以this.isAlive爲false。如果想要run函數中this.isAlive爲true的話,使用this.run即可

/**
 * @author: xianzhixianzhixian
 * @date: 2018/11/6 7:35 PM
 */
public class Run {

    public static void main(String[] args){
        CountOperate c = new CountOperate();
        Thread t = new Thread(c);
        System.out.println("main start t isAlive="+t.isAlive());
        t.setName("A");
        t.start();
        System.out.println("main end t isAlive="+t.isAlive());
    }
}

對比結束,希望對疑惑的你有些幫助,感謝閱讀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章