多線程——調用start()方法與直接調用run()方法的區別


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去分配本機系統的資源,才能實現多線程。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM