【问题标题】:In Java why Thread class is created as Concrete Class?在 Java 中,为什么将 Thread 类创建为具体类?
【发布时间】:2014-09-23 16:30:08
【问题描述】:

我们知道在 Java 中创建线程有两种方式。

  1. 实现可运行接口
  2. 扩展 Thread 类 [Thread 是一个具有 run() 方法默认实现的具体类]

在第二种方法中,我们必须提供 run() 方法的实现,以执行我们的线程逻辑。如果是这样,那为什么 JDK 开发者没有将 run() 方法作为抽象的线程类?

我有兴趣知道背后的原因,提供线程类中run()方法的默认实现。

【问题讨论】:

  • 您忘记了t1 = Thread(runnable) 语法
  • 每日提示:忘记 Thread 实现 Runnable 并始终使用构造函数 new Thread(new MyRunnable());
  • 非常感谢 aruisdante 回答了我的问题 :)

标签: java multithreading thread-safety threadpool


【解决方案1】:

如果Thread#run() 是抽象的,那么以下将是编译错误:

Thread t = new Thread(myRunnable);

【讨论】:

  • 如果 Thread#run() 是抽象的,[那么]以下,这是一种更好的创建新线程的方法,将是编译错误
【解决方案2】:

您几乎已经回答了自己的问题。这是run的默认实现

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

也就是说,默认实现会调用通过构造函数传入的 Runnable。这是您在问题中提到的第一种方法。

new Thread( runnable ).start();

如果 run 被声明为抽象,那么正如 kajacx 所指出的那样;那么这种方法就不会编译。

【讨论】:

    【解决方案3】:

    非抽象类中不能有抽象方法!

    因此在Thread 中拥有一个抽象方法也必须使Thread 类抽象。那为什么要停在那里?让它成为一个界面。但是等等..我们已经有了 Thread 类实现的Runnable 接口。

    还要注意我们调用start() 方法而不是run() 方法。 start() 将启动一个新的执行线程。 run() 只会在当前线程中运行方法。

    run() 方法也被覆盖。该方法来自Runnable接口。

    public
    interface Runnable {
        public abstract void run();
    }
    

    扩展线程只是创建线程的另一种方式,它不能是抽象的,因为如果不自己编写具体的实现,您将无法创建线程对象。

    【讨论】:

    • OP 意识到了这一点,他们的问题是为什么Thread 不是抽象类。
    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 2018-10-20
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多