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()方法,並不會新建一個線程。