Java线程执行顺序

时间:2016-12-28 06:29:56

标签: java

我有这个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之前先执行了吗?谢谢

2 个答案:

答案 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()方法之间的哪一行代码。