Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
main函数,实例化线程对象也有所不同,
extends Thread :t.start();
implements Runnable : new Thread(t).start();
总结:
实现implements Runnable接口比继承 extends Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制(不能访问父类的私有成员?)
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
为什么这么说类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享:举个卖票的例子:
以卖票程序为例,通过Thread类完成:
- package org.demo.dff;
- class MyThread extends Thread{
- private int ticket=10;
- public void run(){
- for(int i=0;i<20;i++){
- if(this.ticket>0){
- System.out.println(“卖票:ticket”+this.ticket–);
- }
- }
- }
- };
下面通过三个线程对象,同时卖票: - package org.demo.dff;
- public class ThreadTicket {
- public static void main(String[] args) {
- MyThread mt1=new MyThread();
- MyThread mt2=new MyThread();
- MyThread mt3=new MyThread();
- mt1.start();//每个线程都各卖了10张,共卖了30张票
- mt2.start();//但实际只有10张票,每个线程都卖自己的票
- mt3.start();//没有达到资源共享
- }
- }
如果用Runnable就可以实现资源共享,下面看例子: - package org.demo.runnable;
- class MyThread implements Runnable{
- private int ticket=10;
- public void run(){
- for(int i=0;i<20;i++){
- if(this.ticket>0){
- System.out.println(“卖票:ticket”+this.ticket–);
- }
- }
- }
- }
- package org.demo.runnable;
- public class RunnableTicket {
- public static void main(String[] args) {
- MyThread mt=new MyThread();
- new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
- new Thread(mt).start();//个实例化对象mt,就会出现异常
- new Thread(mt).start();
- }
- };
虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。