1. 简介:Runnable和Thread
为什么要有,Callable接口和Runnable接口?
我们知道创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread,但是这两种创建线程的方式都有个问题,执行完任务后无法获取返回结果,于是,就有了Callable接口和Runnable接口。
看看创建线程的两个方法:
Class MyThread extends Thread{
@Override
Void run(){
}
}
new MyThread().start();
Class MyTask implements Runnable {
Void run(){
}
}
new Thread( new MyTask()).start();
顺便说下:
- new MyThread().start():会启动一个线程执行run方法
- new MyThread().run();:在本线程中执行run方法
那么Runnable和Thread有什么区别呢其实这二者本身就没有本质区别,就是接口和类的区别!!
- 创建线程的方式有两种,一种是实现Runnable接口,另一种是继承Thread。
- Runnable接口支持多继承,但基本上用不到,就是接口的特性而已。
- Thread实现了Runnable接口并进行了扩展,而Thread和Runnable的实质是实现的关系,不是同类东西,所以Runnable或Thread本身没有可比性。
目前网络上其实流传着一个谬论:Runnable更容易可以实现多个线程间的资源共享,而Thread不可以!
网上的例子:
program–Thread:
//program--Thread
public class Test {
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;
}
}
}
}
}
//结果:
Thread ticket = 5
Thread ticket = 5
Thread ticket = 4
Thread ticket = 3
Thread ticket = 2
Thread ticket = 1
Thread ticket = 0
Thread ticket = 4
Thread ticket = 3
Thread ticket = 2
Thread ticket = 1
Thread ticket = 0
Process finished with exit code 0
program–Runnable:
//program--Runnable
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
MyThread2 mt=new MyThread2();
new Thread(mt).start();
new Thread(mt).start();
}
static class MyThread2 implements Runnable{
private int ticket = 5;
public void run(){
while(true){
System.out.println("Runnable ticket = " + ticket--);
if(ticket < 0){
break;
}
}
}
}
}
//结果:
Runnable ticket = 5
Runnable ticket = 4
Runnable ticket = 3
Runnable ticket = 1
Runnable ticket = 0
Runnable ticket =