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

Scenario where extending thread is preferred than implement Runnable?

本问题已经有最佳答案,请猛点这里访问。

作为初学者,我阅读了Java中实现多线程的2种方法。

我在某某和其他许多线程上都读过这个线程。

据说

"prefer runnable" , extends thread only when you are specialising Thread's behaviour.

有人能给我一小段帮助我理解这一行的代码片段,来解释一下专门化线程行为是什么意思吗?


您应该像扩展其他库类一样扩展Thread

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

你是否想在这里扩展ArrayList仍然是一个争论,但这个争论还没有到这个问题上。

因此,扩展线程的一个例子是一个在特定时间后自行终止的线程。然后您将拥有SuicidingThread extends Thread,它可以让一个构造函数占用时间。

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

现在您可以执行以下任一操作:

  • 埃多克斯1〔19〕
  • 埃多克斯1〔20〕

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


专门化意味着扩展现有线程类的功能。它可以是任何东西,这取决于应用程序的需求。我在下面提到的那个可能逻辑上不正确。

1
2
3
4
5
6
7
8
9
public class MyThread extends Thread{
@Override
public void interrupt() {
    if(thread has started some operation on database){
        //roll back transaction
    }
    super.interrupt();
}
}

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


与线程扩展相比,首选可运行实现有以下几个原因:

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

  • 实际上,扩展线程将强制您为每个线程创建类的新实例实例,而不是在可运行的情况下共享相同的实例。看看这个。

  • Java只支持单个继承

扩展线程的合法用例的一个例子是,当需要设计一个具有作为cachedThreadPool一部分的自定义属性(例如:缓存资源)的线程类时


Java不支持多重继承,这意味着只能在Java中扩展一个类,所以一旦扩展了EDCOX1,1类,就失去了机会,不能在Java中扩展或继承另一个类,所以该类仅用于线程。

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

扩展类通常意味着添加新功能、修改或改进行为。如果我们不在Thread上做任何修改,那么使用Runnable接口。

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


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

1
2
3
4
class Person{
 String name;
 int age;
}

然后你要创造一个能扩展人的阶级人

1
2
3
class Man extends Person{

}

现在,您已经使用了extends关键字来声明人是一个人。然后,如果你希望一个EDCOX1的0个字节像一个线程那样执行,那么你就不能再扩展EDCOX1 1,因为Java不支持多继承。所以只要使用EDCOX1×2接口就可以与其他接口一起实现。

1
2
3
4
class Man extends Person implements Runnable{
  public void run()[
  }
}

编辑:"只在线程的行为专用时扩展线程"意味着您的类只是一个没有其他特征的线程,因为当您的类包含其他特征时,您需要扩展其他超级类而不是EDCOX1的1类。正如我之前提到的,Java不支持多继承,所以只需退出。只有当你特别注意线程的行为时,才会使用DS线程。