使用Runnable接口与Thread类相比,解决了单继承的局限,仅仅这一点,就让Runnable接口的应用多得多了
1.
观察Thread类的定义:
public class Thread extends Object implements Runnable
这种结构如果画图分析的话,非常像代理设计模式,但是又不是,因为客户端调用代理类的方法,不是接口里提供的方法,也就是run()方法。
2.
Runnable接口和Thread类都可以描述数据共享,但是Runnable接口更适合多个相同的程序代码的线程去处理同一个资源的操作
数据共享,即多个线程访问同一资源的操作,
例:
//Thread类
class MyThread extends Thread{
private int ticket = 10 ;
public void run() {
for (int x=0 ; x < 100 ; x++){
if(this.ticket > 0) {
System.out.println("ticket =" + this.ticket--);
}
}
}
}
public class Nice {
public static void main(String args[]) {
//每一个类都有start()方法,所以每一个类对象就是一个线程对象,可以直接启动
MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
MyThread mt3 = new MyThread();
mt1.start() ;
mt2.start() ;
mt3.start() ;
//若是三个名称一样,那么会有异常抛出
}
}
//三个类的对象,分别调用三次start()方法,但是发现每一个线程都是买自己的10张票,没有资源共享
//Runnable接口
class MyThread implements Runnable {
private int ticket = 10 ;
public void run() {
for (int x=0 ; x < 100 ; x++){
if(this.ticket > 0) {
System.out.println("ticket =" + this.ticket--);
}
}
}
}
public class Nice {
public static void main(String args[]) {
MyThread mt = new MyThread();
new Thread(mt).start() ; //Thread类不可以这样,因为它本身就是Thread,不需要这样调用
new Thread(mt).start() ;
new Thread(mt).start() ;
}
}
//此时也属于三个线程对象,区别是,这三个线程对象都直接占用了MyThread类对象引用,即他们都直接访问同一个资源
解释Thread类与Runnable接口实现多线程的区别?(面试题:解释多线程两种实现方式的区别?)
1. Thread类是Runnable接口的子类,使用Runnable接口可以避免单继承局限
2. Runnable接口实现的多线程,可以比Thread类实现的多线程更加清楚的描述数据共享的概念