run.start()方法永远不会调用run()

时间:2016-09-11 17:48:02

标签: java multithreading constructor

我写过一个小型的多线程程序。

run() method called

本书就是这样写的。但是,我从未在控制台中获得run()语句。因此,似乎永远不会调用{{1}}。这怎么可能是真的?

编辑:是的,从构造函数启动Thread是不好的做法,但这不会影响问题。 (我得到的票数太多了)

1 个答案:

答案 0 :(得分:9)

  

run.start()方法

永远不会调用run()

您的代码实际上适用于我的系统,但它不会对您的系统起作用,表明您有一个经典的竞争条件。

main()内部,NewThread被构造,但Java语言表示它可以重新排序操作,以便构造函数中的操作可以在构造函数完成后发生。因此,main()可能在 NewThread实际启动之前完成,这可能导致JVM在不运行线程的情况下关闭。

由于指令重新排序,你不应该在构造函数内部自动启动一个线程。请参阅:Why not to start a thread in the constructor? How to terminate?

你应该这样做:

public NewThread() {
    t = new Thread(this, "Thread created by Thread Class.");
    System.out.println("Created by constuctor:" + t);
    // don't start here
}
public void start() {
    // start in another method
    t.start();
}
public void run() {     
    System.out.println("run() method called.");     
}
...

public static void main(String[] args) {
    NewThread nt = new NewThread();
    nt.start();
}

由于NewThread与主线程(非守护进程)具有相同的守护进程状态,因此在nt.run()完成之前JVM不会关闭。