1. 程式人生 > >Thread中start()和run()的區別

Thread中start()和run()的區別

原文連結:

http://www.cnblogs.com/skywang12345/p/3479083.html

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()的區別示例

下面,通過一個簡單示例演示它們之間的區別。原始碼如下:

複製程式碼
 1 // Demo.java 的原始碼
 2 class MyThread extends Thread{  
 3     public MyThread(String name) {
 4         super(name);
 5     }
6 7 public void run(){ 8 System.out.println(Thread.currentThread().getName()+" is running"); 9 } 10 }; 11 12 public class Demo { 13 public static void main(String[] args) { 14 Thread mythread=new MyThread("mythread"); 15 16 System.out.println(Thread.currentThread().getName()+" call mythread.run()");
17 mythread.run(); 18 19 System.out.println(Thread.currentThread().getName()+" call mythread.start()"); 20 mythread.start(); 21 } 22 }
複製程式碼

執行結果

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