- 通过Thread类和Runnable接口都可以实现多线程,但是两者还是有区别的,如果一个类继承Thread类,则不适合用于多线程资源共享;而实现了Runnable接口,就可以方便的实现资源的共享。
1、继承Thread类不能资源共享
class MyThread extends Thread{
private int ticket=5;
public void run(){
for(int i=0;i<100;i++){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票:ticket"+ticket--);
}
}
}
}
public class ThreadDemo{
public static void main(String args[]){
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
MyThread mt3=new MyThread();
mt1.start();
mt2.start();
mt3.start();
}
}
输出结果:
以上程序通过继承Thread类实现了多线程,程序中启动了3个线程,但是3个线程却各自卖出了5张票,而不是一共卖出5张票达到资源共享的目的。
2、实现Runnable接口可以实现资源共享
class MyThread_9_7 implements Runnable{
private int ticket=10;
public void run(){
for(int i=0;i<100;i++){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"买票:ticket="+ticket--);
}
}
}
}
public class RunnableDemo02 {
public static void main(String[] args) {
MyThread_9_7 my=new MyThread_9_7();
Thread t1=new Thread(my,"t1");
t1.start();
Thread t2=new Thread(my,"t2");
t2.start();
Thread t3=new Thread(my,"t3");
t3.start();
}
}
输出结果:
从程序的运行结果可以清楚的发现,虽然以上程序启动了3个线程,3个线程一共才卖出10票,即ticket的属性被所有的线程对象共享。
- 结论:继承Thread类,就是多个线程各自完成自己的任务;实现Runnable接口,就是多个线程共同完成一个任务。
可见,实现Runnable接口相对于继承Thread类来说,有如下优势:
(1)适合相同程序的多个线程去处理同一资源的情况。
(2)可以避免由于Java的单继承特性带来的局限。
(3)增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。