无法理解以下输出的逻辑: -

时间:2018-02-10 02:50:50

标签: multithreading

public class Test implements Runnable
{
    public void run()
    {
        System.out.printf("%d",3);
    }
    public static void main(String[] args) throws InterruptedException
    {
        Thread thread = new Thread(new Test());
        thread.start();  //line10
        System.out.printf("%d",1);
        thread.join();
        System.out.printf("%d",2);
    }

}

在上面的代码中,第10行是thread.start();应该生成一个新的线程,因此应该调用run()。因此,输出应该是312但是在运行程序时,我得到了132。

3 个答案:

答案 0 :(得分:0)

创建的主线程和新线程并行运行,因此如果主线程首先到达第11行,您将看到1,然后如果新线程首先到达其语句,您将获得3然后1

答案 1 :(得分:0)

开始将线程置于可运行模式,它并不意味着直接在启动内部的某个地方调用run方法,在start()之后,它依靠调度器来最终运行线程,因此312 132 123都是可接受的结果。

答案 2 :(得分:0)

多线程的本质是,如果同时执行多行,通常不能保证或预测哪一行在另一行之前执行。

在这种情况下,它可能有点可预测。第10行需要访问Test类型的内存(堆)分配,然后访问run()方法的内存位置,然后 em>执行run()方法,然后在该函数中运行printf

根据您使用的语言,这可能会有所不同;但无论优化程度如何,它仍然总是慢于thread.start()在第10行之后立即打印1而不等待之后运行下一行。