class MyThread3 extends Thread{ private String title; public MyThread3(String title){ this.title=title; } @Override public void run() { for(int i=0;i<10;i++){ System.out.println(this.title+".x="+i); } } } public class ThreadTest3 { public static void main(String[] args) { MyThread3 mt1=new MyThread3("線程1"); MyThread3 mt2=new MyThread3("線程2"); MyThread3 mt3=new MyThread3("線程3"); mt1.run(); mt2.run(); mt3.run();//只是順序執行,不是多線程 mt1.start(); mt2.start(); mt3.start();//調用Thread類的start方法才是正確啟動多線程的方式 } }
調用run方法的結果是:
線程1.x=0
線程1.x=1
線程1.x=2
線程1.x=3
線程1.x=4
線程1.x=5
線程1.x=6
線程1.x=7
線程1.x=8
線程1.x=9
線程2.x=0
線程2.x=1
線程2.x=2
線程2.x=3
線程2.x=4
線程2.x=5
線程2.x=6
線程2.x=7
線程2.x=8
線程2.x=9
線程3.x=0
線程3.x=1
線程3.x=2
線程3.x=3
線程3.x=4
線程3.x=5
線程3.x=6
線程3.x=7
線程3.x=8
線程3.x=9
調用start方法的結果是:
線程2.x=0
線程2.x=1
線程2.x=2
線程2.x=3
線程2.x=4
線程3.x=0
線程3.x=1
線程3.x=2
線程3.x=3
線程3.x=4
線程3.x=5
線程3.x=6
線程3.x=7
線程3.x=8
線程3.x=9
線程1.x=0
線程1.x=1
線程1.x=2
線程1.x=3
線程1.x=4
線程1.x=5
線程1.x=6
線程1.x=7
線程1.x=8
線程1.x=9
線程2.x=5
線程2.x=6
線程2.x=7
線程2.x=8
線程2.x=9
查看Thread類的start方法的源碼:
public synchronized void start() { if (threadStatus != 0) throw new IllegalThreadStateException(); group.add(this); boolean started = false; try { start0(); started = true; } finally { try { if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { } } }
首先,這個方法會拋出一個異常"IllegalThreadStateException",按照原來的處理方式應該使用throws聲明,或者直接在方法中進行try...catch,在這里說明它是一個RuntimeException的子類這個異常只是在重復啟動了多線程時才會拋出,所以一個線程對象只能夠啟動一次。
然后,在start方法里調用了一次start0方法,這個方法是一個只聲明未定義的方法,並且使用了native關鍵字進行定義native指的是調用本機的原生系統函數。所以,調用start方法,會告訴JVM去分配本機系統的資源,才能實現多線程。