【问题标题】:Can you please explain this Thread working?你能解释一下这个线程的工作原理吗?
【发布时间】:2013-10-14 08:42:12
【问题描述】:

这是关于线程的代码.....我不知道这两个 new() 语句之间的区别。

  Runnable r=new Runnable() {
    public void run() {
    System.out.print("Cat");
    }
    };

    Thread t=new Thread(r) {
    public void run() {
    System.out.println("Dog");
    }
    };
    t.start();

输出是狗 但是为什么以及如何?

【问题讨论】:

  • 你没有启动runnable

标签: java multithreading runnable ocpjp


【解决方案1】:

因为你重写了Thread#run(),所以这个方法最终会在你启动线程的时候执行。默认的Thread#run() 代表传入的Runnable。经验法则:提供Runnable 或覆盖Thread#run(),但不要同时使用!

【讨论】:

  • 实际上,经验法则是从不创建线程的子类,很少有这样做的理由
  • 同意,将Runnable 传递给Thread 可以在解耦方面实现更简洁的设计。但不幸的是(可能是由于遗留原因)类Thread 不是final,因为它可能应该是。实际上根本不应该使用原始线程(学习Java线程编程的基础知识除外); Java 新的并发框架为多线程编程提供了更好(更安全)的抽象。
【解决方案2】:

在线程 t 中,你重写了传递给它的 runnable 的 run 方法。我认为这就是为什么当您调用具有可运行的线程的开始并且不调用其运行方法时!

【讨论】:

    【解决方案3】:

    在第一个“new”语句中,您创建了一个 Runnable 实例,稍后您将其传递到由第二个“new”语句创建的线程中。输出是 dog,就像在您创建线程的第二个“新”语句中一样,您还覆盖了 run() 方法,这必须优先于您传入的 Runnable 中 run() 的实现。 这意味着从不使用打印 Cat 的 run() 的 Runnable 实现,只有打印 Dog 的 run() 实现被线程调用。

    【讨论】:

      【解决方案4】:

      改为:

      Runnable r=new Runnable() {
      public void run() {
      System.out.print("Cat");
      }
      };
      
      Thread t=new Thread(r);
      t.start();
      

      这应该打印“猫”

      【讨论】:

        【解决方案5】:

        在创建 Thread 对象(例如 t)时,您已经覆盖了 run() 方法。所以调用t.start() 将执行被覆盖的方法。所以输出是Dog 而不是Cat

        【讨论】:

          【解决方案6】:

          改成:

          new Thread(new Runnable() {
              public void run() {
                  System.out.print("Cat");
              }
          }).start();
          

          Runnable 接口提供了一种使用 Thread 类的替代方法,用于无法使您的类扩展 Thread 类的情况。当我们的类想要在单独的线程上运行时应该扩展其他一些类时,就会发生这种情况。由于没有多重继承,我们的类不能同时扩展Thread类和另一个。在这种情况下,您的类必须实现 Runnable 接口。

          【讨论】:

            【解决方案7】:

            由于 Runnable 是一个接口,而 Thread 是一个类,因此在 JVM 管理它们的方式上存在一些差异。

            -如果你实现了Runnable接口,线程之间将共享一个唯一的对象。

            -扩展Thread类,每个线程都会创建一个对象。

            在某些情况下,runnable 会比 Thread 消耗更少的内存。 此外,我认为如果你扩展一个类,那是因为你想重写一些方法,所以从我的角度来看,如果你不会修改 Thread 类的任何方法或行为,你应该使用 Runnable..

            希望对您有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-02-16
              • 1970-01-01
              • 2015-11-27
              • 1970-01-01
              • 2013-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多