Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 意外输出。请解释一下_Java_Multithreading - Fatal编程技术网

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

我一直在试图找出以下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 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