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 请解释原因?
答案 0 :(得分:4)
MyThread 来自构造函数
foo 来自run
方法,该方法在调用start()
时被调用。
基本上run()
方法(打印 baz )在main
中被覆盖。
并且run(String s)
是重载的方法,此处没有任何意义。
答案 1 :(得分: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");
}
答案 2 :(得分:1)
首先创建MyThread
的实例,该实例调用构造函数并打印“MyThread”。然后,您拨打调用t.start();
方法的run
。
即使你定义了一个run
方法打印“bar”,它也会被main
方法中的那个覆盖(打印“foo”)。
尝试以下方法:
Thread t = new MyThread();
t.start();
看看会发生什么!
答案 3 :(得分:1)
原因是首先调用create对象构造函数MyThread
并打印字符串的第一部分。启动线程时,继续执行run方法并打印foo
。
答案 4 :(得分:1)
MyThread 的默认构造函数中的第一个输出,覆盖 run()
方法:
Thread t = new MyThread()
{
public void run()
{
System.out.println(" foo");
}
};
输出:
线程foo
Thread t = new MyThread() ;
输出:
MyThread的 酒吧
请注意,首先您覆盖run()
方法并在其中使用自定义消息,但第二个将在 MyThread 类中默认覆盖run()
。
答案 5 :(得分:0)
创建run
时,您将覆盖Thread t
方法。这个新的实现打印“foo”,它优先于你在MyThread类中实现的那个,它仍然运行自己的构造函数来打印“MyThread”。