扩展线程优先于实现Runnable的场景?

时间:2014-03-18 09:21:34

标签: java multithreading runnable

作为一名初学者,我正在阅读有关在Java中实现多线程的两种方法。

我在SO和许多其他线程上阅读了这个thread

据说

  

"更喜欢可跑步" ,仅在您专门处理Thread的行为时才扩展线程。

有人可以通过向我提供一小段片段来帮助我理解这一行,从而向我解释专业化线程行为的含义。

5 个答案:

答案 0 :(得分:11)

您应该扩展Thread,扩展其他库类。

List为例,更具体地说是ArrayList可以在其上添加额外的行为,例如在添加某个谓词失败时拒绝值。
然后你可以称之为PredicatedArrayList

关于你是否想在这里扩展ArrayList仍然是一个争论,但是这个问题的辩论还没有解决。

因此,扩展线程的一个示例是在特定时间后杀死自己的线程。然后你会有SuicidingThread extends Thread,它可能有一个构造函数花时间。

这甚至强化了你应该把你的实际任务放在Runnable中的论点 与Runnable somethingRunnable = new SomeClass();一样,SomeClass implements Runnable

现在你可以做到:

  • Thread someThread = new Thread(somethingRunnable);
  • Thread someThread = new SuicidingThread(somethingRunnable, 5, TimeUnit.DAYS);

所以这将是扩展线程的用例。

答案 1 :(得分:2)

专业化意味着,扩展现有Thread类的功能。它可以是任何取决于应用程序要求的东西。我在下面提到的那个可能不符合逻辑。

public class MyThread extends Thread{
@Override
public void interrupt() {
    if(thread has started some operation on database){
        //roll back transaction
    }
    super.interrupt();
}
}

在中断线程之前,我们可以检查当前是否正在运行任何数据库操作并回滚它。虽然可以从中断的catch块完成,但是如果在应用程序的不同位置创建该线程的大量实例,则从扩展类处理它会减少行数。这只是一个例子,没有人会这样使用它。 :)

答案 2 :(得分:0)

因为java不支持多继承。 如果你有一个名为Person的类。

class Person{
 String name;
 int age;
}

然后你想要创建一个扩展Person

的类Man
class Man extends Person{

}

现在您已使用extends关键字声明Man是Person。然后,如果你想像线程一样执行Man,你就不能再扩展Thread,因为Java不支持多继承。所以只需使用Runnable接口即可实现与其他接口一起使用。

class Man extends Person implements Runnable{
  public void run()[
  }
}

编辑: "只有当你专注于线程的行为时才会扩展线程"意味着你的类只是一个没有其他功能的Thread,因为当你的类包含其他功能时,你需要扩展其他超级类而不是Thread类。正如我之前提到的,java不支持对于多继承,所以只有在专门处理Thread的行为时才扩展线程。

答案 3 :(得分:0)

Java不支持多重继承,这意味着你只能在Java中扩展一个类,所以一旦扩展Thread类,你就失去了机会,无法在Java中扩展或继承另一个类,所以这个类专门针对Thread。

通过extending Thread,每个线程都有一个与之关联的唯一对象,而实现Runnable时,许多线程可以共享同一个可运行的实例。

扩展类通常意味着添加新功能,修改或改进行为。如果我们不对Thread进行任何修改,请改用Runnable界面。

当你想对它做一些修改时,线程类有一些由JDK开发人员决定的行为,那么你可以用Thread类扩展你的类并修改它。

答案 4 :(得分:0)

优先选择Runnable实现而不是Thread扩展有几个原因:

  • 总是更喜欢组合而不是继承,最终你会得到更少的耦合代码。 决定你的课程如何与线程相关的一种方法是检查"是一个"关系vs"有一个"。

  • 实际上,扩展Thread将强制您为每个线程创建类的新实例实例,而不是在Runnable的情况下共享相同的实例。请参阅this

  • Java仅支持单继承

扩展Thread的合法用例的一个例子是当你需要设计一个带有自定义属性的Thread类(例如:缓存资源)时,它是CachedThreadPool的一部分