我写过一个小型的多线程程序。
run() method called
本书就是这样写的。但是,我从未在控制台中获得run()
语句。因此,似乎永远不会调用{{1}}。这怎么可能是真的?
编辑:是的,从构造函数启动Thread是不好的做法,但这不会影响问题。 (我得到的票数太多了)
答案 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不会关闭。