Java中Runnable和Thread的区别的疑问

时间:2022-03-14 14:05:49

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()

方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。

在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:

1、避免点继承的局限,一个类可以继承多个接口。 

2、适合于资源的共享 

以上为在其他博客上看到的观点,还有一篇专门文章讲“Runnable可以实现资源共享但Thread不能实现资源共享的原因”,这是链接,但是如果换另一种思路看起来也是可以实现Thread资源共享的,不知对不对…

上代码:

一个继承自Thread类:

package com.zz.bridge;
/**
* 扩展自Thread类
* Copyright 2015年6月13日
* created by txxs
* all right reserved
*/
public class ThreadDemo0 extends Thread {
private int ticket = 5;

public void run(){
for(int i =0;i<500;i++){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
}
}
}
}

一个实现Runnable接口

package com.zz.bridge;
/**
* 实现Runnable接口
* Copyright 2015年6月13日
* created by txxs
* all right reserved
*/
public class ThreadDemo1 implements Runnable {
private int ticket =5;

@Override
public void run(){
for(int i =0;i<500;i++){
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
}
}
}

}

分别对应的测试类和实现的结果:

ThreadDemo0的测试类:

package com.zz.bridge;
/**
* 测试继承自Thread类
* Copyright 2015年6月14日
* created by txxs
* all right reserved
*/
public class ThreadTest2 {

public static void main(String[] args) {
/**
* 之前的博客(http://blog.chinaunix.net/uid-20665441-id-310538.html)说,
* 继承Thread类的实例,用同一个实例化对象就会异常,不明白,亲自试了一下
* 发现这两种方式都可以实现线程共享,不明白为什么大家都说不可以
*/
ThreadDemo0 ticketThread0 = new ThreadDemo0();
Thread th4 = new Thread(ticketThread0); //线程一
th4.setName("售票口10");
Thread th5 = new Thread(ticketThread0); //线程二
th5.setName("售票口11");
Thread th6 = new Thread(ticketThread0); //线程三
th6.setName("售票口12");
th4.start();
th5.start();
th6.start();
}

}

ThreadDemo0结果:

Java中Runnable和Thread的区别的疑问

ThreadDemo1的测试类:

package com.zz.bridge;
/**
* 实现Runnable接口
* Copyright 2015年6月14日
* created by txxs
* all right reserved
*/
public class ThreadTest1 {

public static void main(String[] args) {

ThreadDemo1 ticketThread1 = new ThreadDemo1();
Thread th1 = new Thread(ticketThread1); //线程一
th1.setName("售票口7");
Thread th2 = new Thread(ticketThread1); //线程二
th2.setName("售票口8");
Thread th3 = new Thread(ticketThread1); //线程三
th3.setName("售票口9");
th1.start();
th2.start();
th3.start();

}

}

运行结果:

Java中Runnable和Thread的区别的疑问

从以上的运行结果可以看出,继承Thread和实现Runnable都实现了资源共享,但是为什么大家都认为这种方式不可以呢,还是我实现的方式有问题?