在Java中,为什么线程类被创建为具体类?

在Java中,为什么线程类被创建为具体类?,java,multithreading,thread-safety,threadpool,Java,Multithreading,Thread Safety,Threadpool,我们知道有两种方法可以在Java中创建线程 实现可运行接口 扩展Thread类[Thread是一个具体的类,具有run()方法的默认实现] 在第二种方法中,我们必须为run()方法提供实现,以执行线程逻辑。如果是这样的话,那么为什么JDK开发人员并没有将run()方法作为线程类中的抽象方法呢 我很想知道背后的原因,在Thread类中提供run()方法的默认实现。如果Thread\run()是抽象的,那么下面将是编译错误: Thread t = new Thread(myRunnable); 你

我们知道有两种方法可以在Java中创建线程

  • 实现可运行接口
  • 扩展Thread类[Thread是一个具体的类,具有run()方法的默认实现]
  • 在第二种方法中,我们必须为run()方法提供实现,以执行线程逻辑。如果是这样的话,那么为什么JDK开发人员并没有将run()方法作为线程类中的抽象方法呢

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

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

    Thread t = new Thread(myRunnable);
    

    你几乎已经回答了你自己的问题。下面是run的默认实现

    public void run() {
        if (target != null) {
            target.run();
        }
    }
    
    也就是说,默认实现调用通过构造函数传入的Runnable。这是你在问题中提到的第一种方法

    new Thread( runnable ).start();
    

    若run被声明为抽象,那个么正如kajacx所指出的那个样;那样的话,这种方法就不适用了

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

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

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

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

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

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

    您忘记了
    t1=Thread(runnable)
    syntaxTip of the day:忘记线程实现Runnable并始终使用构造函数new Thread(new MyRunnable());非常感谢Aruistante回答了我的问题:)OP知道这一点,他们的问题是为什么
    Thread
    不是一个抽象类。如果Thread#run()是抽象的,[那么]下面是创建新线程的更好方法,这将是一个编译错误