注意:
通过继承Thread父类和通过实现Runnable接口实现线程操作,在线程的运行本质上没有什么区别,网上一些说 “与继承Thread相比,使用Runnable实现多线程可以达到资源共享目的” 是错的。他们用来证明的例子也是错的。大多数例子都是用继承Thread类的多个线程去操作了多个不同的资源,而用实现Runnable接口的多个线程去操作了相同的资源,然后拿两者的运行结果作比较,从而得出了上面错误的结论。,实际上以上两者都可以达到资源共享,也都可以资源不共享(而且都存在多种不同的实现方式),想要达到资源共享,只需把握住问题的核心 “想办法让多个线程操作的是同一个资源” 无论用哪种方式,只要遵循了这个核心原则,就都能达成资源共享的目的。
那 Thread 与 Runnable 有啥区别呢?
Thread本身继承自Runnable,是一个Runnable的具体实现,对Runnable进行了增强处理。所以Thread在功能上要比Runnable接口丰富。Thread提供了一系列 线程方法与属性跟踪,还可以跟踪线程堆栈及线程组与子线程的情况。
其次就是java本身的 “继承父类” 与 “实现接口” 之间的区别了。java只能单继承,但可以实现多个接口(java8开始,接口允许为方法提供“默认实现”了,也就是相当于可以实现多继承了)
什么时候用 Thread 什么时候用 Runnable
个人感觉这个没啥可纠结的,看具体情况吧!如果只单纯的用到了一个run方法,没有用到其它额外功能的方法就用实现Runnable的方式足够了,其它用继承Thread的方式吧!(其实都可以,看具体情况吧)。
下面的两个例子中,队列sharedQ
的操作都是synchronized同步的,类型可以换成 LinkedList 增、删速度较快,懒得再改了,备注一下。
生产者-消费者示例,处理单个共享队列(实现接口方式)
1 |
|
生产者-消费者示例,处理多个共享队列(继承父类方式)
1 |
|
暂时就这些,后面没有了!(=^ ^=)