本文內容部分引自《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());
}
}
對比結束,希望對疑惑的你有些幫助,感謝閱讀!