作为一名初学者,我正在阅读有关在Java中实现多线程的两种方法。
我在SO和许多其他线程上阅读了这个thread。
据说
"更喜欢可跑步" ,仅在您专门处理Thread的行为时才扩展线程。
有人可以通过向我提供一小段片段来帮助我理解这一行,从而向我解释专业化线程行为的含义。
答案 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
的类Manclass 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的一部分