Java 意外输出。请解释一下
我一直在试图找出以下Java程序输出背后的原因:Java 意外输出。请解释一下,java,multithreading,Java,Multithreading,我一直在试图找出以下Java程序输出背后的原因: public class Main { public static void main(String args[]) { Runnable r = new Runnable() { @Override public void run() { System.out.println("Implementation"); } }; MyThread gaurav = new
public class Main {
public static void main(String args[]) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Implementation");
}
};
MyThread gaurav = new MyThread(r);
new Thread(r).start();
gaurav.start();
}
}
class MyThread extends Thread {
Runnable runnable;
public MyThread(Runnable r) {
runnable = r;
}
@Override
public void run() {
super.run();
System.out.println("Thread");
}
}
上面的输出是:“实现”,然后是下一行中的“线程”。现在问题在于这句话:
gaurav.start();
当我将可运行的r传递给MyThread时,我认为r将被执行,因此,输出也将是这个的“实现”。但很明显,我遗漏了一些东西。两种说法之间也存在差异:
new Thread(r).start();
gaurav.start();
对于这种情况,这将是非常有用的。谢谢。MyThread的start方法将启动线程的run方法,其中包含
System.out.println(“线程”)代码>
而新线程(r.start()
将运行System.out.println(“实现”)代码>
这完全取决于操作系统的调度程序,哪个线程将首先运行。因此,您可能会将输出视为:
Implementation
Thread
或
考虑以下几点:
public class Main {
public static void main(String args[]) {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Implementation");
}
};
MyThread gaurav = new MyThread(r);
gaurav.start();
}
}
class MyThread extends Thread {
Runnable runnable;
public MyThread(Runnable r) {
// calling Thread(Runnable r) constructor.
super(r);
// runnable isn't used anywhere. You can omit the following line.
runnable = r;
}
@Override
public void run() {
// First it will run whatever Runnable is given
// into Thread's constructor.
super.run();
System.out.println("Thread");
}
}
输出:
Implementation
Thread
我猜您的困惑来自MyThread
中的Runnable
字段。您认为,通过将它放在那里,您可以以某种方式覆盖线程
自己的runnable,但您没有。如果你想这样做,你应该在你的构造函数中调用super(r)
。你只把runnable
放在MyThread
的一个字段中,没有地方可以运行它。这就是为什么它不输出任何东西作为MyThread
的一部分。就输出而言,您最好不要将Runnable
传递给MyThread
。谢谢,我收到了。但是,即使我在这里发帖之前尝试了很多这个问题,我仍然不明白为什么我会被否决。@gauravjain stackoverflow社区有很多这样的问题“不要浪费时间阅读问题正文,只阅读标题”,他们认为你对执行顺序感到困惑,而且以前也有人问过。他们正在竞相争取一个被接受的答案。@mostruash是的,我想从现在开始,我会更加小心标题。:)他只是问为什么两个线程都不输出实现
。我想他不是在问死刑的顺序。
Implementation
Thread