0
class MyThread extends Thread 
{
    MyThread() 
    {
        System.out.print(" MyThread");
    }
    public void run() 
    {
        System.out.print(" bar");
    }
    public void run(String s) 
    {
        System.out.println(" baz");
    }
}
public class TestThreads 
{
    public static void main (String [] args) 
    {
        Thread t = new MyThread() 
        {
            public void run() 
            {
                System.out.println(" foo");
            }
        };
        t.start();
    }
}

您好,我是 java 新手,目前正在学习多线程,当我运行上述程序时,我得到了这个特定的输出MyThread foo请解释为什么?

4

6 回答 6

4

MyThread来自构造函数

foo来自run被调用时start()被调用的方法。

本质上,该run()方法(打印baz您的main.

而 therun(String s)是一个重载的方法,在这里没有任何意义。

于 2013-05-27T06:02:34.100 回答
1

它正在执行MyThread构造函数,然后执行run()方法。

Thread t = new MyThread(),您正在尝试创建一个MyThread对象,因此它执行构造函数。

MyThread() 
{
    System.out.print(" MyThread");
}

然后你启动线程t.start();,它执行run()你已经覆盖的方法main(String[] args)

public void run() 
{
     System.out.println(" foo");
}
于 2013-05-27T06:03:48.337 回答
1

您首先创建一个实例MyThread,它调用构造函数并打印“MyThread”。然后,您调用t.start();which 调用该run方法。

即使您定义了一个run打印“bar”的方法,它也会被main方法中的那个(打印“foo”)覆盖。

尝试以下操作:

Thread t = new MyThread();
t.start();

看看会发生什么!

于 2013-05-27T06:04:11.010 回答
1

原因是首先在创建对象时调用构造函数MyThread并打印字符串的第一部分。当您启动线程时,使用 run 方法和 print 继续执行foo

于 2013-05-27T06:05:01.597 回答
1

MyThread默认构造函数中的第一个输出,它覆盖了一个run()方法:

Thread t = new MyThread() 
        {
            public void run() 
            {
                System.out.println(" foo");
            }
        };

输出:

线程 foo

Thread t = new MyThread() ;

输出:

我的线程栏

请注意,您覆盖了第一个run()方法并在其中使用了自定义消息,但第二个将在MyThreadrun()中默认覆盖。

于 2013-05-27T06:05:16.280 回答
0

您在创建时覆盖了该run方法Thread t。这个新实现打印“foo”,它优先于您在 MyThread 类中实现的那个,后者仍然运行自己的打印“MyThread”的构造函数。

于 2013-05-27T06:06:24.087 回答