这个程序的输出是“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”,这是怎么回事? 请解释.....非常感谢
答案 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方法。