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());
    }
}

对比结束,希望对疑惑的你有些帮助,感谢阅读!

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