【问题标题】:Scenario when we need to implement Runnable as well as subclass Thread当我们需要实现 Runnable 以及子类 Thread 时的场景
【发布时间】:2015-11-11 16:54:20
【问题描述】:

您好,我最近看到一个博客,其中指出:

有时您可能必须实现 Runnable 以及子类 线。例如,如果创建一个 Thread 的子类,它可以 执行多个 Runnable。这通常是当 实现一个线程池。

我不确定这句话指的是什么场景。

你能帮我理解这种情况吗?

谢谢。

【问题讨论】:

  • 你得问问作者。我看不出有什么理由必须对 Thread 进行子类化。您所需要的只是一个可以调用其他 Runnable 的 Runnable。顺便说一句,ThreadPoolExecutor 是一个相当复杂且有特色的线程池,它以 ThreadFactory 作为参数。所以它不必创建任何 Thread 子类。 docs.oracle.com/javase/7/docs/api/java/util/concurrent/…
  • 我觉得你应该在作者的博客上问同样的问题,如果没有记错Jenkov
  • 我认为“运行多个 Runnable 的线程”这一说法具有误导性。线程只能运行由其构造函数提供的 Runnable 实例,或者它可以自己运行,因为 Thread 本身就是 Runnable。后者发生在您继承 Thread 并覆盖其 run() 方法时。

标签: java multithreading threadpool


【解决方案1】:

查看此链接:"implements Runnable" vs. "extends Thread"

正如乔恩·斯基特所说:

实际上,这意味着您也可以实现 Runnable 并从另一个类扩展。

例子:

public class Worker extends Person implements Runnable {...}

您引用的报价是您实际上需要使用线程的子类来实现更复杂的机制。例如。你实现了一个可以处理多个任务的线程。

public SimpleExecutionService extends Thread() {

    private List<Runnable> myTasks;

    public SimpleExecutionService(List<Runnable> tasks){
        myTasks = tasks;
    }
    public void run() {
        for(Runnable task: myTasks) {
            task.run();
        }
    }

顺便说一句,这种并发机制已经很多了。

【讨论】:

  • 您实际上不需要 Thread 子类来执行此操作。只需让 SimpleExecutionService 实现 Runnable 而不是扩展 Thread,并将 SimpleExecutionService 实例传递给 Thread 的构造函数,您将获得相同的结果,而无需扩展 Thread。我同意这可能是作者的意思,但他错了。
【解决方案2】:

我不认为作者暗示你会在同一个类中实现Runnable 和子类Thread。自然,如果您从头开始实现线程池,您将至少有一个可能扩展Thread 的工作程序实现,并且您将有可能实现Runnable 的任务。这将是一个非常基本且直接的场景。

【讨论】:

  • 每次扩展 Thread 时,都会扩展 Thread 并在同一个类中实现 Runnable,因为 Thread 已经实现了 Runnable。无需扩展 Thread 即可实现工作线程。顺便说一句,ThreadPoolExecutor 没有。
【解决方案3】:

实际上当你想在Thread实现类中扩展另一个类时使用Runnable接口。如果扩展 Thread 类,则无法扩展其他重要类,因为 java 不支持多重继承。所以,消除这个问题,Runnable Thread Interface 应运而生,避免了这个问题.....

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    相关资源
    最近更新 更多