有关实现Runnable的问题

可能重复:
Java:“实现Runnable”与“扩展线程”

我有两个有关多线程编程的问题。 我在网上阅读了一些答案,但仍然找不到令人满意的答案。

  • 实现Runnable比扩展线程类更受欢迎。 为什么?

  • 我们如何能够忽略run()方法?

  • 根据Herbert Schildt的“The Complete Reference to Java”,如果我们不覆盖除run()以外的任何Thread类的方法,最好是实现Runnable。

    我的第二个问题可能听起来有点愚蠢,但我似乎错过了一些东西,我不确定整个事情是如何工作的。


    1:实现Runnable比扩展线程类更受欢迎。 为什么?

    因为它允许你的类如果想要扩展另一个类而不是被迫扩展Thread

    2:我们如何能够摆脱run()方法?

    你当然可以重写其他方法,但是当线程启动时, Thread对象会调用run()方法。 这就是它的工作原理。 默认的Thread.run()方法是:

    public void run() {
        if (target != null) {
            target.run();
        }
    }
    

    如果使用Runnable调用Thread构造函数,那么这就是target设置的target 。 如果您改为扩展Thread@Override run()方法,那么这是在线程对象启动时将被调用的方法。

    这就是Thread类的工作原理。

    2:我们如何能够摆脱run()方法?

    您可能在这里有错误,而是问为什么我们只需要在Runnable()实现run()方法。

  • Runnable是一个必须实现的单个run()方法的接口。
  • Thread是您正在扩展的具体类。 您可以重写具体类中的任何方法,除非该类是final或方法是final
  • 确保你使用正确的Java术语,不查询股价implementoverride


    在深入研究之前需要三个基础。

  • 一个类只能extend一个类。
  • 一个类可以implement任意数量的接口。
  • 一个接口可以extend任意数量的接口。
  • 另外, abstract类是一个类。 因此,它的行为就像一个类,你不能implement它。 你只能extend它。


    如果您扩展Thread,而实现Runnable时没有获得这些陷阱,则会出现一些陷阱。

    public static String getName() {
        return "My Test Application";
    }
    
    public static void stop() {
        System.out.println("Shutting down");
    }
    
    public static void main(String... args) {
        new Thread() {
            @Override
            public void run() {
                System.out.println(getName());
                stop();
            }
        }.run();
        System.out.println("Bye now.");
    }
    

    版画

    Thread-0
    Bye now.
    

    看看你能发现多少错误。

    链接地址: http://www.djcxy.com/p/92071.html

    上一篇: questions on implementing Runnable

    下一篇: Why should I use Runnable instead of Thread?