Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA线程的执行顺序_Java_Multithreading - Fatal编程技术网

JAVA线程的执行顺序

JAVA线程的执行顺序,java,multithreading,Java,Multithreading,我试着从一本书(Paul Hyde,Java线程编程)中运行这个示例。它说线程的顺序将交换。但我总是得到:10张“主线”照片和10张“新线”照片。 更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将是相反的。也许是因为这本书很老,而且示例基于JDK1.2???代码如下: public class TwoThread extends Thread { public void run() { for (int i = 0; i < 10; i

我试着从一本书(Paul Hyde,Java线程编程)中运行这个示例。它说线程的顺序将交换。但我总是得到:10张“主线”照片和10张“新线”照片。 更有趣的是:如果我将使用tt.run而不是tt.start,那么结果将是相反的。也许是因为这本书很老,而且示例基于JDK1.2???代码如下:

public class TwoThread extends Thread
{
    public void run()
    {
        for (int i = 0; i < 10; i++)
        {
            System.out.println("New thread");
        }
    }

    public static void main(String[] args)
    {
        TwoThread tt = new TwoThread();
        tt.start();

        for (int i = 0; i < 10; i++)
        {
            System.out.println("Main thread");
        }
    }
}
公共类TwoThread扩展线程
{
公开募捐
{
对于(int i=0;i<10;i++)
{
System.out.println(“新线程”);
}
}
公共静态void main(字符串[]args)
{
TwoThread tt=新的TwoThread();
tt.start();
对于(int i=0;i<10;i++)
{
System.out.println(“主线程”);
}
}
}

JVM决定何时将控制权从主线程转移到第二个线程。由于主线程在启动第二个线程后不会执行太多工作,因此JVM允许它在将控制权转移到第二个线程之前完成其工作是有意义的

当您使用
tt.run()
而不是
tt.start()
时,您不会启动第二个线程。您正在主线程中执行
run()
方法。因此,您将首先看到
“新线程”
输出

如果我将使用tt.run而不是tt.start,那么结果将是相反的

tt.run
仅在
main
线程中运行,而
tt.start
生成另一个线程。因此,结果是可以预期的

关于一致性:


对于较小且快速的活动,您可能会偶尔看到一致的结果,但这并不意味着您看到的打印顺序是有保证的。如果使用
tt.run(),则将循环迭代次数增加到更高的数字,并查看打印顺序(例如打印多达10000次)

您只有一个线程(由于您首先调用该方法,它将首先打印“新线程”)。这是
start()调用,创建并启动一个实际的新执行线程。尝试循环到1000,您就会知道。是的,如果循环次数过多,它会起作用。您永远不应该对线程的执行顺序做出假设。这就是同步原语存在的原因。这还取决于机器是否有多核处理器,以及是否支持超线程。JVM不在线程之间“转移控制”,而是同时运行这两个线程。即使在单核非ht处理器上,一旦两个线程都运行(在任何执行抢占式多任务的操作系统上),排序也是完全随机的。在Leo的示例中,使用某种程度上可预测的顺序的原因是线程启动时间。