扩展Thread类的主要优点是什么(或何时扩展Thread而不是实现runnable)

she*_*aei 7 java multithreading

我试图找出扩展Thread类的可能优点是什么?

这是我描述的另一个问题的一部分:在Java中有两种创建线程的方法

  1. 从Thread类扩展
  2. 实现可运行的接口

正如此处所述,使用runnable接口有几个好处.我的问题是从Thread类扩展的优势是什么?我想到的唯一优势是可以从Thread类扩展,让我们称之为ThreadExtended类.然后他/她可以在ThreadExtended中添加更多功能(我不知道它可能是什么),然后当他/她想要创建一个线程,而不是从Thread类扩展时,它从ThreadExtended扩展.

使用Thread类而不是Runnable接口有什么优势吗?您是否知道从Thread类扩展的任何类,然后要求用户从这些类扩展,如果他们想要具有多线程功能?

    public class ThreadExtended extends Thread{
    //override some functions || add more functionality to Thread class
    }

    public class MyThread extends ThreadExtended{
     public void run()
    {
     for(int i=0;i<10;i++)
        {
          System.out.println("Using ThreadExtended instead of Thread directly");
        }
    }

    public static void main(String args[])
    {
    MyThread myThread = new MyThread();
    myThread.start();
    }
    }
Run Code Online (Sandbox Code Playgroud)

Ron*_*ren 8

扩展Thread类很少有令人信服的理由.我想在大多数情况下,你最终都会把所有'做一些东西'的逻辑扔到run方法中.

你应该坚持实现Runnable.通过选择扩展Thread,您创建的类层次结构可能是荒谬的,并且最终会限制您在将来重构事物的选项.通过选择实现Runnable,您不需要实现者的血统,并且您可以使用强大的抽象(如ExecutorService)来抽象出运行一大块代码的细节.最后,更喜欢实现一个接口而不是扩展一个类是一个好习惯!


par*_*fal 5

扩展的唯一原因Thread是,如果需要添加与线程本身关联的行为,而不是线程正在执行的任务.

例如,如果你正在实现一个线程池(没有人应该再做,给定java.util.concurrent),你需要改变线程的行为,以便(1)它可以接受新的工作,并且(2)它将自己返回给游泳池.以非常简化的形式:

public void setRunnable(Runnable runnable) {
    this.runnable = runnable;
}

public void run() {
    while (true) {
        // wait on lock
        try {
            this.runnable.run();
        }
        catch (Throwable ex) {
            // do something with exception
        }
        finally {
            // return to pool
        }
    }
}
Run Code Online (Sandbox Code Playgroud)