区别:
- Tread是类,Runnable是接口,extends只能继承一个,implement可以多个;
2.Thread内部也是实现Runnable接口的;
public class Thread implements Runnable {}
3.线程的事情最终还是需要Runable来实现的;无论是继承还是接口。
new Thread(new ThreadByThread()).start
public class ThreadByThread extends Thread{
@Override
public void run() {
//依靠自身Runable接口的run方法实现事情
super.run();
}
}
new Thread(new ThreadByRunable()).start
public class ThreadByRunnable implements Runnable{
@Override
public void run() {
//Runable接口的run方法实现事情
}
}
总结:
new Thread() 就是新起线程,可以什么都不干e.g
new Thread().start;
Runable () 接口提供了 事情实现方法;
形象理解:
Thread() 代表人,new了多少个Thread() 就是 有多少个人;
Runable() 代表球,new了多少个Runable()就是有多少个球;
ThreadByRunable tr=new ThreadByRunable(); //产生了一个球A
new Thread (tr).start; //一个人抢球A
new Thread (tr).start; //两个人抢球A
ThreadByThread tt=new ThreadByThread(); //注意Thread 内部已经有一个Runable;且自身产生了一个Thread;
tt.start; //代表一个人抢自己的球;
tt.start; //报错,因为tt对应的Thread已经start了,
最后:
关于网上较好解析:
Thread和Runnable实现多线程的区别
new MyThread().start();
new MyThread().start();
new MyThread().start();
MyThread my = new MyThread();
new Thread(my).start();
new Thread(my).start();
new Thread(my).start();
产生的不同 主要原因是第二个Runable 只有一个实例 ;如改成下列形式,则跟Thread的效果一样的
new Thread( new MyThread();).start();
new Thread( new MyThread();).start();
new Thread( new MyThread();).start();
归纳:
所以重点看Runable的实例有多少个;
Thread自身已经有一个Runable;