解释多线程的输出

时间:2012-03-15 14:55:05

标签: java multithreading

这个程序的输出是“Inside Thread Inside Thread”,这是怎么回事?

class MyThread extends Thread 
{ 
    MyThread() {} 
    MyThread(Runnable r) {super(r); } 
    public void run() 
    { 
        System.out.print("Inside Thread ");
    } 
} 
class MyRunnable implements Runnable 
{ 
    public void run() 
    { 
        System.out.print(" Inside Runnable"); 
    } 
} 
class ThreadRunnableBoth 
{  
    public static void main(String[] args) 
    { 
        new MyThread().start();
        new MyThread(new MyRunnable()).start(); 
    } 
}

我可以理解第一次“Inside Thread”是如何打印的,但是对于第二次打印,我希望打印“Inside Runnable”但它会打印“Inside Thread”,这是怎么回事? 请解释.....非常感谢

5 个答案:

答案 0 :(得分:1)

MyThread课程中,您将覆盖run()方法。这意味着即使您将Runnable传递到构造函数中,也只会调用您的 run方法,并且将忽略Runnable目标。

以下是您要覆盖的Thread.run()方法代码:

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

如果你想使用runnable,我会这样做:

new Thread(new MyRunnable()).start();

那不使用MyThread类。

答案 1 :(得分:1)

run()的{​​{1}}方法只需调用java.lang.Thread,其中target.run()是构建期间提供的target。但是,在Runnable中,您已覆盖此功能;你的MyThread版本会忽略目标,而是打印“Inside Thread”。

解决此问题的一种方法是使用基础run()类的实例运行Runnable

Thread

其他可能性 无法覆盖new Thread(new MyRunnable()).start(); ,或从您的覆盖中调用run()

答案 2 :(得分:1)

run中的Thread方法定义如下:

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

由于您在run中覆盖了MyThread,因此实际上不会调用MyRunnable

获得您期望的行为:

new MyThread().start();
new Thread(new MyRunnable()).start(); 

答案 3 :(得分:0)

new MyThread().start();

在这种情况下,创建Thread通过MyThread(){} constructer调用MyThread类的run()方法。

在第二种情况下,创建线程通过MyThread(Runnable)构造函数调用同一MyThread类的run()方法。

答案 4 :(得分:0)

将第二次调用更改为Thread:

new Thread(new MyRunnable()).start

因为您的自定义线程会覆盖即使将runnable传递给线程构造函数后也将调用的run方法。