java根本教程之Thread中start()和run()的差別 java多線程教程。本站提示廣大學習愛好者:(java根本教程之Thread中start()和run()的差別 java多線程教程)文章只能為提供參考,不一定能成為您想要的結果。以下是java根本教程之Thread中start()和run()的差別 java多線程教程正文
Thread類包括start()和run()辦法,它們的差別是甚麼?本章將對此作出解答。本章內容包含:
start() 和 run()的差別解釋
start() 和 run()的差別示例
start() 和 run()相干源碼(基於JDK1.7.0_40)
start() 和 run()的差別解釋
start() : 它的感化是啟動一個新線程,新線程會履行響應的run()辦法。start()不克不及被反復挪用。
run() : run()就和通俗的成員辦法一樣,可以被反復挪用。零丁挪用run()的話,會在以後線程中履行run(),而其實不會啟動新線程!
上面以代碼來停止解釋。
class MyThread extends Thread{
public void run(){
...
}
};
MyThread mythread = new MyThread();
mythread.start()會啟動一個新線程,並在新線程中運轉run()辦法。
而mythread.run()則會直接在以後線程中運轉run()辦法,其實不會啟動一個新線程來運轉run()。
start() 和 run()的差別示例
上面,經由過程一個簡略示例演示它們之間的差別。源碼以下:
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) {
}
}
}
運轉成果:
main call mythread.run()
main is running
main call mythread.start()
mythread is running
成果解釋:
(01) Thread.currentThread().getName()是用於獲得“以後線程”的名字。以後線程是斧正在cpu中調劑履行的線程。
(02) mythread.run()是在“主線程main”中挪用的,該run()辦法直接運轉在“主線程main”上。
(03) mythread.start()會啟動“線程mythread”,“線程mythread”啟動以後,會挪用run()辦法;此時的run()辦法是運轉在“線程mythread”上。
start() 和 run()相干源碼(基於JDK1.7.0_40)
Thread.java中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()啟動線程的。而start0()會新運轉一個線程,新線程會挪用run()辦法。
private native void start0();
Thread.java中run()的代碼以下:
public void run() {
if (target != null) {
target.run();
}
}
解釋:target是一個Runnable對象。run()就是直接挪用Thread線程的Runnable成員的run()辦法,其實不會新建一個線程。