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,看看下面的代码,它总是显示“主线程完成” 我的问题是,为什么主线程总是比新线程运行得快?结果“新线程完成”是否可能?我在Windows、CentOS、macOS上都试过,都是“主线程完成”。我没有发现任何文档说java中的主线程总是比任何其他线程都快。主线程首先开始旋转出一个需要旋转的线程,然后转到它的print语句。当第二个线程正在旋转时,第一个线程正在完成。它更快,因为它是先开始的。然后第二个线程(在原始代码中,在编辑之前)被包装在一个try语句中,这会增加一点开销 不过,正如其他人所说,它

看看下面的代码,它总是显示“主线程完成”


我的问题是,为什么主线程总是比新线程运行得快?结果“新线程完成”是否可能?我在Windows、CentOS、macOS上都试过,都是“主线程完成”。我没有发现任何文档说java中的主线程总是比任何其他线程都快。

主线程首先开始旋转出一个需要旋转的线程,然后转到它的print语句。当第二个线程正在旋转时,第一个线程正在完成。它更快,因为它是先开始的。然后第二个线程(在原始代码中,在编辑之前)被包装在一个try语句中,这会增加一点开销


不过,正如其他人所说,它并不总是按此顺序完成的,但是您可能会看到,由于上述原因,当在相同的系统上以相同的状态运行时,它以这种顺序半可靠地执行。

主线程首先开始旋转出一个需要旋转的线程,然后继续执行其打印语句。当第二个线程正在旋转时,第一个线程正在完成。它更快,因为它是先开始的。然后第二个线程(在原始代码中,在编辑之前)被包装在一个try语句中,这会增加一点开销


正如其他人所说,虽然它不会总是按此顺序完成,但您可能会看到,由于上述原因,当在相同的系统上以相同的状态运行时,它以这种顺序半可靠地执行。

启动线程需要时间,因此您没有按我的方式进行公平的比较,我可能是错的,虽然两个线程似乎做相同的事情,但需要考虑创建新线程的开销。创建一个新线程并不是一蹴而就的,JVM在某个时候需要向操作系统请求一个新线程来使用,这可能需要时间。我以DUP的身份回答了一个不同的问题,因为根本的问题是:这里显示的代码没有进行适当的度量。从这种天真的方法中得出的数字。。。根本不可信。例如,请注意,仅这些对out.printl()的调用就需要相当长的时间。。。这是无法预测的。基本的答案是:线程以“相同的速度”运行,除非你能展示一个真正的基准测试,它证明了执行时间的巨大差异,否则我只是想:你在寻找幽灵。在我看来,你问的问题是错误的,你应该问为什么主线程比新线程打印得快。“更快打印”一词描述了你眼前看到的证据。“运行得更快”这个词描述了你对证据含义的错误结论。启动一个线程需要时间,因此你没有做一个公平的比较。我认为,虽然两个线程似乎做相同的事情,但需要考虑创建一个新线程的开销,这可能是错误的。创建一个新线程并不是一蹴而就的,JVM在某个时候需要向操作系统请求一个新线程来使用,这可能需要时间。我以DUP的身份回答了一个不同的问题,因为根本的问题是:这里显示的代码没有进行适当的度量。从这种天真的方法中得出的数字。。。根本不可信。例如,请注意,仅这些对out.printl()的调用就需要相当长的时间。。。这是无法预测的。基本的答案是:线程以“相同的速度”运行,除非你能展示一个真正的基准测试,它证明了执行时间的巨大差异,否则我只是想:你在寻找幽灵。在我看来,你问的问题是错误的,你应该问为什么主线程比新线程打印得快。“更快打印”一词描述了你眼前看到的证据。“运行得更快”这个词描述了你对证据含义的错误结论。线程不是进程。所以这不是“旋转出一个进程”。吹毛求疵,但真正的问题是:上面的代码绝对不是一个有效的基准。时期任何观察到的打印语句的持续时间或顺序大多是“随机的”。下次可能会大不相同。仅“打印”一项就要承担相当大的运行时成本。换言之:当你做随机的事情,并且测量不好时,结果不值得“解释”。很抱歉,sleep(0)只是给了其他人一个机会,原始代码中有sleep and try语句。问题不是“这是一个有效的基准测试吗”,这就是为什么对我来说,总是以相同的顺序完成。在这种情况下,它可能是随机的,但由于我所解释的原因,它并没有被视为随机的和可能的。我添加了一个附录以确保它是随机的,但这仍然不是一个关于基准测试的问题。线程不是进程。所以这不是“旋转出一个进程”。吹毛求疵,但真正的问题是:上面的代码绝对不是一个有效的基准。时期任何观察到的打印语句的持续时间或顺序大多是“随机的”。下次可能会大不相同。仅“打印”一项就要承担相当大的运行时成本。换言之:当你做随机的事情,并且测量不好时,结果不值得“解释”。很抱歉,sleep(0)只是给了其他人一个机会,原始代码中有sleep and try语句。问题不是“这是一个有效的基准测试吗”,这就是为什么对我来说,总是以相同的顺序完成。在这种情况下,它可能是随机的,但由于我所解释的原因,它并没有被视为随机的和可能的。我添加了一个附录,以确保它是随机的,但这仍然不是一个关于基准测试的问题。
    private static class Person{
        private String name;
    }

    public static void main(String[] args) throws InterruptedException {
        final Person person = new Person();

        new Thread(()->{

            System.out.println("new Thread Done");
            //person.name = "Jack";

        }).start();


        //person.name = "Tom";

        System.out.println("Main Thread Done");


        //System.out.println(person.name);
    }