2016-07-04 80 views
0

嗨,我无法找到我得到这个输出的原因。我知道第一个输出,但第二行我无法理解。我是线程新手,但我仍然有疑问。有人可以解释吗?无法知道这个多线程程序的输出

输出是:

Inside ThreadEx 
Inside ThreadEx 

这里是我的代码:

class ThreadEx extends Thread{ 

    ThreadEx(){} 

    ThreadEx(Runnable r) 
    { 
     super(r); 
    } 

    public void run() 
    { 
     System.out.println("Inside ThreadEx"); 
    } 
} 

class RunnableEx implements Runnable{ 

    @Override 
    public void run() { 
     System.out.println("Inside RunnableEx "); 
    } 
} 

public class Test4 { 

    public static void main(String[] args) { 

     new ThreadEx().start(); 
     new ThreadEx(new RunnableEx()).start(); 
    } 
} 

回答

2

,因为你在ThreadEx类中重写run()方法,它发生。如果您使用

new Thread(new RunnableEx()).start() 

,而不是

new ThreadEx(new RunnableEx()).start() 

,你会看到预期的输出(我猜的预期输出为Inside ThreadEx Inside RunnableEx

0

您覆盖新语丝“跑”的方法。 最初的“run”方法调用Runnable的“run”方法(这里:“r”)。 但是你可以覆盖它,所以它只会叫你“的System.out。......”

原来是

@Override 
public void run() { 
    if (target != null) { 
     target.run(); 
    } 
} 

public void run() 
{ 
    System.out.println("Inside ThreadEx"); 
} 

所以才有了第二替换无论你的Runnable怎么说,都会执行一个。

0

Thread类实现Runnable该接口有方法运行,而Thread类为该方法提供了默认实现。

有关您的代码 - >

所以main方法的第一行被调用,其延伸Thread Class.It有一个方法运行(ThreadEx类的默认构造函数),这实际上是一个方法Thread supperclass,你可以覆盖,所以我认为@Override缺少上面的运行method.Ok,直到这里。

那么,你看到

new ThreadEX().start(); 

你在做上面加你开始这个thread.You已经Implemeted一个run()中提到,它会打印“里面的ThreadX”。主要方法

SECOND LINE - >

主要方法的下一行被调用类ThreadEX给予Runnable对象的第二构造函数。正如你所看到的是提供RunnableEX这是一个实现这个接口的类。它覆盖了run()方法。所以,当你在这一行启动线程

new ThreadEx(new RunnableEx()).start(); 

Thread它会打印 '里面RunnableEX'

有关替代

http://docs.oracle.com/javase/tutorial/java/IandI/override.html