参考:https://blog.csdn.net/zhaojianting/article/details/97664370
实际上没有啥区别,能用Runnable实现的Thread都能实现!
如果非要说区别,请看如下:
- Runnable的实现方式是实现其接口即可
- Thread的实现方式是继承其类
- Runnable接口支持多继承,但基本上用不到
- Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系,不是同类东西,所以Runnable或Thread本身没有可比性。
启动一个线程时通过Thread实现的,所以当类是实现Runnable时,他就变成了普通类,传入Thread实现中,那么就可以多个Thread去实现同一个类的run方法,但用继承thread的类时,我们要用多个线程操作这个方法时,要用synchronized ,并且里面的数据要是静态数据或者是全局数据,不能是这个new出来的类的成员数据,应为你创建一个thread时,就会创建全新的该对象的所有变量和方法!!!
thread测试一:
package com.example.dtest.threadTest.drifferent;
public class ThreadTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
new MyThread().start();
new MyThread().start();
}
static class MyThread extends Thread{
private int ticket = 5;
public void run(){
while(true){
System.out.println("Thread ticket = " + ticket--);
if(ticket < 0){
break;
}
}
}
}
}
测试结果:
runnable测试:
package com.example.dtest.threadTest.drifferent;
public class RunnableTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread2 mt=new MyThread2();
new Thread(mt,"mt1").start();
new Thread(mt,"mt2").start();
}
static class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
while(true){
// synchronized (this){
if(ticket < 0){
break;
}else {
System.out.println(Thread.currentThread().getName()+"--Runnable ticket = " + ticket--);
}
// }
}
}
}
}
注意这里没有synchronized加锁,所以不能保证操作的原子性,虽然操作的是同一个对象,但是对线程是开放状态,而且 ticket–操作在java底层除了加锁,没其他办法保证其原子性!
Thread2操作:
package com.example.dtest.threadTest.drifferent;
public class ThreadTest02 extends Thread{
private int ticket = 5;
public void run(){
for(int i =0;i<10;i++){
synchronized (this){
if(this.ticket>0){
try {
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"卖票---->"+(this.ticket--));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] arg){
ThreadTest02 t1 = new ThreadTest02();
new Thread(t1,"线程1").start();
new Thread(t1,"线程2").start();
}
}
看出来了吧,继承Thread的类也可以把它放在其他线程里面跑,不用自己跑,所以两个的区别其实不大!!!



