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