我为什么要使用Runnable而不是Thread?

时间:2015-05-31 01:49:59

标签: java

我只是学习关于线程的理论。还有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?

感谢。

2 个答案:

答案 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>的队列,则除非实际运行,否则不会使用尽可能多的内存。