【问题标题】:What is more advisable to create a thread by extending a Thread class or implementing Runnable? [duplicate]通过扩展 Thread 类或实现 Runnable 来创建线程更可取的是什么? [复制]
【发布时间】:2011-01-22 22:18:10
【问题描述】:

我想知道通过扩展线程类或实现Runnable接口创建线程哪个更可取。为什么?

谢谢..

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    您应该将其设为Runnable,然后将其添加到任何现有的线程池类中。您将工作单元封装在新类中,然后使用线程来运行它。

    如果你对线程类本身做一些事情,你只会扩展Thread,比如用新的功能扩展它。我怀疑是这样的。

    另一种方法是创建一个由线程和自定义逻辑组成的新类,例如它有一个Thread 内部和它自己的'execute()' 方法,它调度线程并将(this) 添加为一个工作项,对外部完全隐藏......但在这种情况下,你将让你的课程@ 987654324@ 无论如何,只是提供一种方便的方法,使其更容易添加到线程中。

    【讨论】:

      【解决方案2】:

      如果你扩展 Thread,你总是必须调用 .start(),它会启动一个 NEW 线程并执行任务。

      如果你让它 Runnable,你也可以做 new Thread(runnable).start(),但你不限于此。您可以回收线程,从而节省一些资源,如下所示:

      ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
      service.execute(runnable);
      service.execute(someOtherTask);
      

      先把一堆你的runnables放在一个列表中,然后当你想执行它们时执行它们:

      List<Runnable> todoList = new ArrayList<Runnable>();
      Runnable fetchPaper = new Runnable("paper");
      todoList.add(fetchPaper);
      Runnable fetchMilk = new Runnable("milk");
      todoList.add(fetchMilk);
      
      //do something else or even return todoList...
      ExecutorService recycleSingleThread = Executors.newSingleThreadExecutor();
      for(Runnable task : todoList){
          recycleSingleThread.execute(task);
      }
      

      或者你甚至可以这样做

      runnable.run();
      

      在你自己的线程中。

      也许您甚至可以保存一个可运行文件,然后对其进行反序列化并运行它。
      如果您扩展 Thread,所有这些灵活性都将不存在。

      【讨论】:

        【解决方案3】:

        实例化 Runnable 可以更清晰地将代码与线程实现分开。 Runnable 接口只是声明您可以在不同的线程中运行此代码。

        此外,由于您可以实现多个接口但只能扩展一个类,因此您只能在实现 Runnable 时提供自己的超类。如果扩展 Thread,则不能有任何其他超类。

        对 Runnable 的唯一警告是您需要两个对象,一个 Thread 实例来实际运行代码,一个 Runnable 实现来提供代码。

        【讨论】:

          【解决方案4】:

          可运行,因为您没有向 Thread 类添加专门的行为 - 您只是将您的逻辑标记为能够作为自己的线程运行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-01-10
            • 2014-04-23
            • 1970-01-01
            • 2011-02-16
            • 2013-05-05
            • 2015-04-01
            • 2012-02-15
            相关资源
            最近更新 更多