我只是学习关于线程的理论。还有Thread和Runnable。
class A extends Thread{
public void run(){
while(true) {
System.out.println("Hi");
}
}
}
class B implements Runnable{
public void run(){
System.out.println("Hi");
}
}
线程适用于丰富的API,为什么我会使用Runnable而不是Thread?
感谢。
答案 0 :(得分:12)
1。 Java不支持多重继承,这意味着您只能扩展一个Java类,所以一旦扩展Thread
类,您就失去了机会而无法扩展(继承) java中的另一个类。
2. 在OOP中扩展类通常意味着添加新功能,修改或改进行为。如果您未对Thread
进行任何修改,请改用Runnable
界面。
3。实施Runnable
会使您的课程更加灵活(您可以实施多个界面)。
答案 1 :(得分:4)
其中一个重要优点是:您不必在新线程上运行Runnable
。
有一天,您可能决定不是在新线程上运行它,而是直接(在当前线程上)或在线程池上运行它 - 然后您可以将new Thread(runnable).start()
更改为{{ 1}}或threadPool.submit(runnable)
- 此更改仅影响一个地方。
此外,如果你留下runnable.run()
,它不会浪费资源 - 它不会计入线程限制(如果有的话),并且不会为堆栈预留空间。假设您希望一次有一个事物队列 - 确定,您可以拥有Runnable
,然后在前一个线程完成时启动每个线程,但是然后您浪费了大量内存 - 运行线程。如果您使用Queue<Thread>
的队列,则除非实际运行,否则不会使用尽可能多的内存。