7

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

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

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

正如这里所解释的,使用可运行接口有几个好处。我的问题是从 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();
    }
    }
4

5 回答 5

9

扩展 Thread 类很少有令人信服的理由。我想在大多数情况下,无论如何,您最终都会将所有“做一些事情”逻辑扔到 run 方法中。

您绝对应该坚持实施 Runnable。通过选择扩展 Thread,您正在创建一个可能是荒谬的类层次结构,并且最终会限制您将来重构事物的选择。通过选择实现 Runnable,您无需对实现者的血统提出任何要求,并且您可以使用ExecutorService等强大的抽象来抽象出运行一大块代码的具体细节。最后,宁愿实现一个接口而不是扩展一个类是一个好习惯!

于 2013-05-10T19:02:55.197 回答
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
        }
    }
}
于 2013-05-10T19:04:55.267 回答
1

I find it clearer to extend Thread if I also configure the thread, for instance:

class FileReaper extends Thread {
    FileReaper() {
        setDaemon(true);
        setName(getClass().getSimpleName());
    }

    @Override public void run() {
        // do something
    }
}
于 2013-05-10T19:23:40.877 回答
0

简而言之,当您扩展 Thread 时,它将是您将要扩展的唯一类!

于 2014-04-08T12:28:56.657 回答
0

Thread如果你想创建一个 Looper 线程,还有一个很好的理由来扩展 a -:

这是一个Looper线程实现的典型例子,使用prepare()和loop()的分离来创建一个初始的Handler来与Looper进行通信。

  class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

UI 线程是 Looper 线程,但您可能想要创建自己的工作 Looper 线程。要了解在其ThreadLooper运行其loop()方法的行为方式,请参阅我最近的回答

于 2017-06-10T22:46:54.457 回答