Thread类和Runnable接口的比较
Thread和Runnable的联系
Thread类的定义:
1 public class Thread extends Object implements Runnable
联系:从Thread类的定义可以看到,Thread类实现了Runnable接口,即可以说Thread是Runnable的子类。
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类的明显优点:
- l 适合多个相同代码的线程去处理同一个资源;
- l 可以避免由于单继承局限所带来的影响;
- l 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。