she*_*aei 7 java multithreading
我试图找出扩展Thread类的可能优点是什么?
这是我描述的另一个问题的一部分:在Java中有两种创建线程的方法
正如此处所述,使用runnable接口有几个好处.我的问题是从Thread类扩展的优势是什么?我想到的唯一优势是可以从Thread类扩展,让我们称之为ThreadExtended类.然后他/她可以在ThreadExtended中添加更多功能(我不知道它可能是什么),然后当他/她想要创建一个线程,而不是从Thread类扩展时,它从ThreadExtended扩展.
使用Thread类而不是Runnable接口有什么优势吗?您是否知道从Thread类扩展的任何类,然后要求用户从这些类扩展,如果他们想要具有多线程功能?
public class ThreadExtended extends Thread{
//override some functions || add more functionality to Thread class
}
public class MyThread extends ThreadExtended{
public void run()
{
for(int i=0;i<10;i++)
{
System.out.println("Using ThreadExtended instead of Thread directly");
}
}
public static void main(String args[])
{
MyThread myThread = new MyThread();
myThread.start();
}
}
Run Code Online (Sandbox Code Playgroud)
扩展Thread类很少有令人信服的理由.我想在大多数情况下,你最终都会把所有'做一些东西'的逻辑扔到run方法中.
你应该坚持实现Runnable.通过选择扩展Thread,您创建的类层次结构可能是荒谬的,并且最终会限制您在将来重构事物的选项.通过选择实现Runnable,您不需要实现者的血统,并且您可以使用强大的抽象(如ExecutorService)来抽象出运行一大块代码的细节.最后,更喜欢实现一个接口而不是扩展一个类是一个好习惯!
扩展的唯一原因Thread是,如果需要添加与线程本身关联的行为,而不是线程正在执行的任务.
例如,如果你正在实现一个线程池(没有人应该再做,给定java.util.concurrent),你需要改变线程的行为,以便(1)它可以接受新的工作,并且(2)它将自己返回给游泳池.以非常简化的形式:
public void setRunnable(Runnable runnable) {
this.runnable = runnable;
}
public void run() {
while (true) {
// wait on lock
try {
this.runnable.run();
}
catch (Throwable ex) {
// do something with exception
}
finally {
// return to pool
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8433 次 |
| 最近记录: |