我有这个java main方法
public class ThreadJoinExample {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
TestJoinClass t1 = new TestJoinClass("t1");
TestJoinClass t2 = new TestJoinClass("t2");
TestJoinClass t3 = new TestJoinClass("t3");
t1.start();
try{
t1.join();
}catch(Exception e){System.out.println(e);}
t2.start();
//thread 3 won't start until thread 2 is complete
t3.start();
}
}
我的主题类是
public class TestJoinClass extends Thread{
//Constructor to assign a user defined name to the thread
public TestJoinClass(String name)
{
super(name);
}
public void run(){
for(int i=1;i<=5;i++){
try{
//stop the thread for 1/2 second
Thread.sleep(500);
}
catch(Exception e){System.out.println(e);}
System.out.println(Thread.currentThread().getName()+
" i = "+i);
}
}
}
此程序的输出是
t1 i = 1
t1 i = 2
t1 i = 3
t1 i = 4
t1 i = 5
t3 i = 1
t2 i = 1
t3 i = 2
t2 i = 2
t3 i = 3
t2 i = 3
t3 i = 4
t2 i = 4
t3 i = 5
t2 i = 5
我只是一个小问题。我想知道为什么t3首先开始运行而不是t2?在代码中,它显示t2.start()在t3.start()之前首先执行。难道输出不能表明t2在t3之前先执行了吗?谢谢
答案 0 :(得分:1)
这证明了许多人对Java中并发性理解的常见错误。
您的bug
在这里:
//thread 3 won't start until thread 2 is complete
应该阅读
//thread 2 and 3 will run in parallel, may start in any order and may also interleave their output
答案 1 :(得分:0)
当java线程的对象调用其start()方法时,程序准备在单独的线程中执行run()方法,并且原始调用线程继续执行。因此,只要调用 t2.start(); , t2 线程就会准备执行其run方法的代码。
但是不能保证 t2 的run()中的第一行代码会在执行t3的run()的第一行代码之前先执行,尽管 t2.start(在代码中 t3.start()之前调用。所以你可能得到不同的执行顺序和输出为t2&amp; t3用于不同机器/不同运行等的当前代码。
因此,总结一下,完全由VM来决定首先执行两个并行执行的run()方法之间的哪一行代码。