Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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

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 线程名和调用run方法两次_Java_Multithreading_Main_Runnable - Fatal编程技术网

Java 线程名和调用run方法两次

Java 线程名和调用run方法两次,java,multithreading,main,runnable,Java,Multithreading,Main,Runnable,我正在学习我在样本测试中看到的以下内容。 我不太清楚为什么下面的代码打印“第一” 调试时,MyRunnable.run似乎被调用了两次。 这是否意味着即使在其他场景中,run方法也总是被调用两次 public class currentThreadName { public static void main(String[] args) { Thread.currentThread().setName("First"); MyRunnable mr =

我正在学习我在样本测试中看到的以下内容。 我不太清楚为什么下面的代码打印“第一”

调试时,MyRunnable.run似乎被调用了两次。 这是否意味着即使在其他场景中,run方法也总是被调用两次

public class currentThreadName {

    public static void main(String[] args) {
        Thread.currentThread().setName("First");
        MyRunnable mr = new MyRunnable("MyRunnable");
        mr.run();       
    }

}

class MyRunnable implements Runnable {
    MyRunnable(String name) {
        new Thread(this, name).start();
    }
    public void run(){
        System.out.println(Thread.currentThread().getName());
    }
}

run
方法被调用两次

一个调用是在
MyRunnable
构造函数中调用
start()
;这在单独的线程中执行。上面印着“MyRunnable”

但是,您也可以在主线程中执行的
main
中直接调用
run
。这负责输出“First”,因为您将名称“First”分配给主线程


通常,您不应该直接调用
run
;仅调用
start
。这将在新线程中调用
run

您正在调用
mr.run()
新线程(这个,名称).start()是的,它运行了两次

我建议您只使用
start
来执行新线程。为什么?

因为如果直接调用
run()
,它将在调用线程上执行(与任何其他方法调用一样)

但是,如果调用
Thread.start()
,它将实际创建一个新线程,以便并行执行runnable的run方法。

Thnx但是为什么“first”总是先打印还是在“MyRunnable”打印之前打印?当调用.start()时,我们不知道何时执行它,这是真的吗?因为JVM不保证任何“第一个”首先打印,因为它在代码的其余部分之前执行。您的第二条语句是正确的,如果两个线程同时处于活动状态,则不能保证哪个线程将首先运行。