Thread和Runnable的子類調用

實現線程的兩種方式:
繼承Thread類。
實現Runnable接口。


下面是一個小案例:


public class ThreadRunnable {
    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方法。

發佈了37 篇原創文章 · 獲贊 23 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章