java解释多线程的输出
这个程序的输出是“内线程内线程”,这是怎么发生的
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();
}
}
我可以理解第一个“内部线程”是如何打印的,但第二次打印我希望打印“内部可运行”,但它打印“内部线程”,这是如何发生的? 请解释。。。。。非常感谢
# 1 楼答案
在
MyThread
类中,您正在重写run()
方法。这意味着,即使您将Runnable
传递到构造函数中,也只会调用您的run方法,并且Runnable
目标将被忽略下面是您要覆盖的
Thread.run()
方法代码:如果您想使用runnable,我会:
不使用
MyThread
类的# 2 楼答案
Thread
中的run
方法定义如下:因为您在
MyThread
中重写了run
,所以它实际上不会调用您的MyRunnable
要获得您期望的行为:
# 3 楼答案
将第二个调用更改为线程:
因为您的自定义线程重写了run方法,即使在您将runnable传递给线程构造函数之后,该方法也将被调用
# 4 楼答案
java.lang.Thread
的run()
方法只调用target.run()
,其中target
是构造期间提供的Runnable
。然而,在MyThread
中,您已经覆盖了这个功能;您的版本run()
忽略目标,而是打印“内部线程”修复此问题的一种方法是使用基类
Thread
的实例运行Runnable
:其他可能是而不是重写
run()
,或者从重写中调用super.run()
# 5 楼答案
在本例中,通过MyThread(){}构造函数调用MyThread类的run()方法创建线程
在第二种情况下,通过MyThread(Runnable)构造函数调用相同MyThread类的run()方法创建线程