2014-10-29 22 views
1

我正在学习,我在示例测试中看到了以下内容。 我不太清楚为什么下面的代码打印“第一”。线程名称和调用运行方法两次

当我调试它看起来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()); 
    } 
} 

回答

2

run方法被调用两次。

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

但是,您也直接在main中调用run,它在主线程中执行。由于您将名称“First”分配给主线程,因此它负责输出“First”。

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

1

你打电话mr.run();new Thread(this, name).start();所以是它运行两次。

我建议你只用start执行你的新线程。为什么?

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

但是,如果您拨打Thread.start()它会实际上创建一个新线程,以便runnable的run方法并行执行。

+0

Thnx但为什么“Frist”总是先打印或在“MyRunnable”打印之前打印?是真的,当

.start()
被称为我们不知道什么时候会得到执行?因为JVM不保证任何东西 – user3431327 2014-10-29 20:13:47

+0

“First”首先打印,因为它在代码的其余部分之前执行。你的第二个陈述是正确的,如果两个线程同时存在,它不能保证哪个将首先运行。 – FunctionR 2014-10-29 20:21:15