Thread类和Runnable接口的比较

Thread和Runnable的联系

Thread类的定义:

1 public class Thread extends Object implements Runnable

联系:从Thread类的定义可以看到,Thread类实现了Runnable接口,即可以说ThreadRunnable的子类。

Thread和Runnable的区别

观察以下程序(程序1):

 1 public class MyThread extends Thread{
 2     private int ticket = 5;
 3     public MyThread(String name){
 4         this.setName(name);
 5     }
 6     @Override
 7     public void run() {    //线程的操作主题
 8         for (int i = 0; i < 100; i++) {
 9             if(ticket>0){
10                 System.out.println(Thread.currentThread().getName()+"卖出一张:还剩"+ticket--+"张票");
11             }
12         }
13     }
14     
15     public static void main(String args[]){
16         MyThread my1 = new MyThread("售票机1");  //实例化对象
17         MyThread my2 = new MyThread("售票机2");  //实例化对象
18         my1.start();
19         my2.start();
20     }
21 }

通过继承Thread类实现的多线程操作,两个售票机虽然是并发运行,但结果显然不是我们想要的,两个售票机各自售出各自的五张票,共卖出10张票,但我们只有五张票。

再看实现Runnable接口创建线程(程序2):

 1 public class MyThread implements Runnable{
 2     private int ticket = 5;
 3     @Override
 4     public void run() {    //线程的操作主题
 5         for (int i = 0; i < 100; i++) {
 6             if(ticket>0){
 7                 System.out.println(Thread.currentThread().getName()+"卖出一张:还剩"+ticket--+"张票");
 8             }
 9         }    
10     }
11     public static void main(String args[]){
12         MyThread my1 = new MyThread();  //实例化对象
13         new Thread(my1,"售票机1").start();       //调用线程主体
14         new Thread(my1,"售票机2").start();       //调用线程主体
15     }
16 }

从运行结果来看,虽然我们启动了两个线程,但是两个线程总共卖出了5张票,所以达到了资源共享。

区别:使用Thread类在操作多线程的时候无法实现资源共享的目的,而使用Runnable接口实现的多线程可以实现资源共享。

总结

实现Runnable接口比继承Thread类的明显优点:

  • 适合多个相同代码的线程去处理同一个资源;
  • 可以避免由于单继承局限所带来的影响;
  • 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。

 

 

 

 

posted @ 2018-01-14 16:32  weller  阅读(539)  评论(0编辑  收藏  举报