91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

阿里后端Java面試題:啟動線程是start()還是run()?為什么?

發布時間:2020-07-19 16:44:16 來源:網絡 閱讀:478 作者:愛碼仕i 欄目:編程語言

面試官:請問啟動線程是start()還是run()方法,能談談嗎?

應聘者:start()方法

當用start()開始一個線程后,線程就進入就緒狀態,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。但是這并不意味著線程就會立即運行。只有當cpu分配時間片時,這個線程獲得時間片時,才開始執行run()方法。start()是方法,它調用run()方法.而run()方法是你必須重寫的. run()方法中包含的是線程的主體(真正的邏輯)。

繼承Thread類的啟動方式

public class ThreadTest {
    public static void main(String[] args) {
        MyThread t =new MyThread();
        t.start();
    }
}
class MyThread extends Thread{
    @Override
         public void run() {
        System.out.println("Hello World!");
    }
}

實現Runnable接口的啟動方式

public class ThreadTest {
    public static void main(String[] args) {
        Thread t =new Thread(new MyRunnable());
        t.start();
    }
}
class MyRunnable implements Runnable{
    @Override
         public void run() {
        System.out.println("Hello World!");
    }
}

實際上這兩種啟動線程的方式原理是一樣的。首先都是調用本地方法啟動一個線程,其次是在這個線程里執行目標對象的run()方法。那么這個目標對象是什么呢?為了弄明白這個問題,我們來看看Thread類的run()方法的實現:

public void run() {
    if (target != null) {
        target.run();
    }
}

當我們采用實現Runnable接口的方式來實現線程的情況下,在調用new Thread(Runnable target)構造器時,將實現Runnable接口的類的實例設置成了線程要執行的主體所屬的目標對象target,當線程啟動時,這個實例的 run()方法就被執行了。

當我們采用繼承Thread的方式實現線程時,線程的這個run()方法被重寫了,所以當線程啟動時,執行的是這個對象自身的 run()方法。

總結起來:如果我們采用的是繼承Thread類的方式,那么這個target就是線程對象自身,如果我們采用的是實現Runnable接口的方式,那么這個target就是實現了Runnable接口的類的實例。

我們再來看一道混跡于各大面試公司筆試的題目:

public class EqualsTest {
    public static void main(String args[]) {
        Thread t = new Thread() {
            public void run() {
                pong();
            }
        }
        ;
        t.run();
        System.out.print("ping");
    }
    static void pong() {
        System.out.print("pong");
    }
}

這里的標準答案是:pongping

這里直接調用線程的run方法,就相當于調用普通方法一樣,由上往下執行,所以最后的結果是pongping。但是如果上面改成t.start()之后,這個結果就不固定了,因為這里有兩個線程(其實還有一個守護線程,這里就先忽略),main線程和 t 線程,這兩個線程獲得cpu的時間就會不固定了,誰先獲得CPU執行權,誰就先打印結果,所以最后的結果可能pongping也可能是pingpong。

寫在最后

阿里后端Java面試題:啟動線程是start()還是run()?為什么?

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

白玉县| 莱芜市| 祁阳县| 延寿县| 自贡市| 志丹县| 门源| 舟曲县| 呼伦贝尔市| 大丰市| 商丘市| 黄石市| 明溪县| 鹤岗市| 油尖旺区| 同仁县| 阿坝县| 马鞍山市| 肥东县| 古交市| 荥经县| 东阳市| 阿拉尔市| 平度市| 遵义县| 长兴县| 普格县| 通辽市| 广河县| 舒城县| 南澳县| 民县| 安远县| 象州县| 丁青县| 体育| 苏尼特右旗| 辉县市| 华安县| 上杭县| 遂平县|