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。
答案 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
而不等待之后运行下一行。