您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Thread的start和run方法的區別是什么,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
Thread中的start()和run()是Java的多線程概念最重要的兩個方法,相信大家在Java學習中,或多或少會對兩者的區別搞不清楚。因此小編就來和大家談談start和run方法,主要內容包括:認識start和run方法、兩者的區別、代碼實例和線程狀態說明。
一、認識Thread的start和run方法。
1、Java中的start()方法是什么?
線程類的start()方法可以用來啟動線程;該方法會在內部調用Runnable接口的run()方法,以在單獨的線程中執行run()方法中指定的代碼。
start()方法啟動線程執行以下任務:
它統計了一個新線程
線程從New State移動到Runnable狀態。
當線程有機會執行時,它的目標run()方法將運行。
2、Java中的run()方法是什么?
線程類的run()方法是Runnable接口的一個抽象方法,由java虛擬機直接調用的,不會創建的新線程。
二、start()方法和run()方法的區別。
1、方法的定義
start()方法在java.lang.Thread類中定義;而,run()方法在java.lang.Runnable接口中定義,必須在實現類中重寫。
2、新線程創建
當程序調用start()方法時,會創建一個新線程,然后執行run()方法。但是如果我們直接調用run()方法,則不會創建新的線程,run()方法將作為當前調用線程本身的常規方法調用執行,并且不會發生多線程。
3、多次調用
start()方法不能多次調用,否則拋出java.lang.IllegalStateException;而,run()方法可以進行多次調用,因為它只是一種正常的方法調用。
三、代碼實例:
通過start啟動線程,異步啟動
public static void?main(String args[]) {
Thread t = new?Thread() {
public void?run() {
pong();
}
};
t.start();
System.out.print("ping");
}
static?void?pong() {
System.out.print("pong");
}
輸出結果: pingpong
通過run啟動線程,同步啟動
public static void main(String args[]) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
}
static?void?pong() {
System.out.print("pong");
}
輸出結果:pongping
通過以上兩個程序實例,可以很容易的區分出start()方法和run()方法的區別:
t.start(); 該行代碼相當于是啟動線程,異步操作
t.run(); 該行代碼相當于是使用t這個類中的run方法而已,只是主線程的一個普通的方法
四、線程狀態說明
線程狀態從大的方面來說,可歸結為:初始狀態、可運行狀態、不可運行狀態和消亡狀態,說明如下:
1)線程的實現有兩種方式,一是繼承Thread類,二是實現Runnable接口,但不管怎樣,當我們new了thread實例后,線程就進入了初始狀態;
2)當該對象調用了start()方法,就進入可運行狀態;
3)進入可運行狀態后,當該對象被操作系統選中,獲得CPU時間片就會進入運行狀態;
4)進入運行狀態后情況就比較多,大致有如下情形:
a. run()方法或main()方法結束后,線程就進入終止狀態;
b. 當線程調用了自身的sleep()方法或其他線程的join()方法,就會進入阻塞狀態(該狀態既停止當前線程,但并不釋放所占有的資源)。當sleep()結束或join()結束后,該線程進入可運行狀態,繼續等待OS分配時間片; 當線程剛進入可運行狀態(注意,還沒運行),發現將要調用的資源被鎖(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這時的鎖池里也許已經有了其他線程在等待獲取鎖標記,這時它們處于隊列狀態,既先到先得),一旦線程獲得鎖標記后,就轉入可運行狀態,等待OS分配 CPU時間片;
c. 當線程調用wait()方法后會進入等待隊列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態后,是不能自動喚醒的,必須依靠其他線程調用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個線程,但我們由不能確定具體喚醒的是哪一個線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實際使用時,一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會進入鎖池,等待獲取鎖標記。 當線程調用stop方法,即可使線程進入消亡狀態,但是由于stop方法是不安全的,不鼓勵使用,大家可以通過run方法里的條件變通實現線程的 stop。
關于Thread的start和run方法的區別是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。