「ds」Thread線程中start()和run()方法的區別

轉載:https://blog.csdn.net/codershamo/article/details/51886430#:~:text=Thread%E7%9A%84run%EF%BC%88%EF%BC%89%E4%B8%8Estart%EF%BC%88%EF%BC%89%E7%9A%84%E5%8C%BA%E5%88%AB&text=%E5%8F%AF%E4%BB%A5%E9%80%9A%E8%BF%87%E5%88%9B%E5%BB%BAThread,%E9%98%BB%E5%A1%9E%E5%92%8C%E6%AD%BB%E4%BA%A1%E3%80%82...

 

1. start()和run()區別


start():用來啓動一個線程, 這時此線程是處於就緒狀態, 並沒有運行。

然後通過此Thread類調用方法run()來完成其運行操作的, 這裏方法run()稱爲線程體, 它包含了要執行的這個線程的內容。

run方法運行結束, 此線程終止, 而CPU再運行其它線程。

start()不能被重複調用。


run(): run()就和普通的成員方法一樣,可以被重複調用

單獨調用run()的話,會在當前線程中執行run(),而並不會啓動新線程!
 

2. 相關源碼(JDK1.7)

2.1 start():

public synchronized void start() {
    // 如果線程不是"就緒狀態",則拋出異常!
    if (threadStatus != 0)
        throw new IllegalThreadStateException();

    // 將線程添加到ThreadGroup中
    group.add(this);

    boolean started = false;
    try {
        // 通過start0()啓動線程
        start0();
        // 設置started標記
        started = true;
    } finally {
        try {
            if (!started) {
                group.threadStartFailed(this);
            }
        } catch (Throwable ignore) {
        }
    }
}

說明:start()實際上通過本地方法start0()調用操作系統的API來創建線程。新的線程處於就緒狀態,等待調度器調試執行run()方法。

 

2.2 run():

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

說明:target是一個Runnable對象。run()就是直接調用Thread線程的Runnable成員的run()方法,並不會新建一個線程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章