在Java中为什么Thread类被创建为Concrete Class?

时间:2014-07-31 16:03:57

标签: java multithreading thread-safety threadpool

我们知道有两种方法可以用Java创建一个Thread。

  1. 实施Runnable接口
  2. 扩展Thread类[Thread是一个具有run()方法的默认实现的具体类]
  3. 在第二种方法中,我们必须提供run()方法的实现来执行我们的线程逻辑。如果是这样,那么为什么JDK开发人员没有在Thread Class中将run()方法作为抽象?

    我很想知道背后的原因,为Thread Class中的run()方法提供默认实现。

3 个答案:

答案 0 :(得分:6)

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

Thread t = new Thread(myRunnable);

答案 1 :(得分:3)

你几乎回答了自己的问题。这是run

的默认实现
public void run() {
    if (target != null) {
        target.run();
    }
}

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

new Thread( runnable ).start();

如果运行已被声明为抽象,那么kajacx也指出了;那个方法不会编译。

答案 2 :(得分:0)

你不能在非抽象类中使用抽象方法!

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

另请注意,我们调用了start()方法,而不是run()方法。 start()将启动一个新的执行线程。 run()将在当前Thread中运行该方法。

还重写了run()方法。该方法来自Runnable接口。

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

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