實現線程的兩種方式:
繼承Thread類。
實現Runnable接口。
下面是一個小案例:
public class Thread和Runnable {
public static void main(String[] args) {
Runnable mr = new MyRunnable();
Thread mt = new Mythread(mr);
mt.start();
}
}
class Mythread extends Thread{
public Mythread(Runnable r){
super(r);
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("MyThread run");
for(int i = 0;i < 100;i ++){
System.out.println(Thread.currentThread().getName()+" = "+i);
}
}
}
class MyRunnable implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("MyRunnable run");
for(int i = 0;i < 100;i ++){
System.out.println(Thread.currentThread().getName()+" = "+i);
}
}
}
最後執行的是MyThread裏面的run方法。這是爲什麼呢?
當我們去查看源碼,Runnable只有一個run方法,Thread實現Runnable接口,在Thread裏面對於run方法的定義
@Override
public void run() {
if (target != null) {
target.run();
}
}
也就是當Thread執行到run方法時,在Thread類定義了
/* What will be run. */
private Runnable target;
會判斷是否有target存在,如果有,則執行Runnable裏面的run方法,但是有多態的存在,會直接執行子類MyThread的run方法,於是不會再去調用MyRunnable的run方法了,也就是不會去調用MyRunnable的run方法。