認識thread的start和run
1) start:
用 start方法來啟動執行緒,真正實現了多執行緒執行,[color=red]這時無需等待run方法體**執行完畢而直接繼續執行下面的**[/color]。通過呼叫thread類的 start()方法來啟動乙個執行緒,[color=red]這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法[/color],這裡方法 run()稱為執行緒體,它包含了要執行的這個執行緒的內容,run方法執行結束,此執行緒隨即終止。
2) run:
run()方法只是類的乙個普通方法而已,如果直接呼叫run方法,程式中依然只有主線程這乙個執行緒,其程式執行路徑還是只有一條,還是要順序執行,還是要等待run方法體執行完畢後才可繼續執行下面的**,這樣就沒有達到寫執行緒的目的。
總結:呼叫start方法方可啟動執行緒,而run方法只是thread的乙個普通方法呼叫,還是在主線程裡執行。
例如:
downloadthread downloadthread = new downloadthread(***info);
//啟動新執行緒
thread thread = new thread(downloadthread);
thread.start();
2、 執行緒狀態說明
執行緒狀態從大的方面來說,可歸結為:初始狀態、可執行狀態、不可執行狀態和消亡狀態,具體可細分為上圖所示7個狀態,說明如下:
1) 執行緒的實現有兩種方式,一是繼承thread類,二是實現runnable介面,但不管怎樣,當我們new了thread例項後,執行緒就進入了初始狀態;
2) 當該物件呼叫了start()方法,就進入可執行狀態;
3) 進入可執行狀態後,當該物件被作業系統選中,獲得cpu時間片就會進入執行狀態;
4) 進入執行狀態後case就比較多,大致有如下情形:
﹒run()方法或main()方法結束後,執行緒就進入終止狀態;
﹒當執行緒呼叫了自身的sleep()方法或其他執行緒的join()方法,就會進入阻塞狀態(該狀態既停止當前執行緒,但並不釋放所占有的資源)。當 sleep()結束或join()結束後,該執行緒進入可執行狀態,繼續等待os分配時間片;
﹒ 當執行緒剛進入可執行狀態(注意,還沒執行),發現將要呼叫的資源被鎖牢(synchroniza,lock),將會立即進入鎖池狀態,等待獲取鎖標記(這 時的鎖池裡也許已經有了其他執行緒在等待獲取鎖標記,這時它們處於佇列狀態,既先到先得),一旦執行緒獲得鎖標記後,就轉入可執行狀態,等待os分配 cpu時間片;
﹒ [color=blue]當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他 執行緒呼叫notify()或notifyall()方法才能被喚醒[/color](由於notify()只是喚醒乙個執行緒,但我們由不能確定具體喚醒的是哪乙個執行緒,也 許我們需要喚醒的執行緒不能夠被喚醒,因此在實際使用時,一般都用notifyall()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池,等待獲取鎖標記。
﹒當執行緒呼叫stop方法,即可使執行緒進入消亡狀態,但是由於stop方法是不安全的,不鼓勵使用,大家可以通過run方法裡的條件變通實現執行緒的 stop。
Thread的start 和run 區別
首先,之所以出現執行緒,就是為了更好的利用cpu,讓她更加 精明 的幹活。通過呼叫thread類的start 方法來啟動乙個執行緒,這時此執行緒是處於就緒狀態,並沒有執行。然後通過此thread類呼叫方法run 來完成其執行操作的,這裡方法run 稱為執行緒體,它包含了要執行的這個執行緒的內容,ru...
Thread的start和run的區別
最近看到乙個題目,如下 public static void main string args t.run system.out.println ping static void pong 問,結果會輸出什麼?我執行了很多次,結果都是pong ping。後來終於發現了關鍵點所在,執行緒物件t,呼叫的...
Thread類的start 和run 方法
啟動執行緒肯定要用start 方法。當用start 開始乙個執行緒後,執行緒就進入就緒狀態,使執行緒所代表的虛擬處理機處於可執行狀態,這意味著它可以由jvm排程並執行。這並不意味著執行緒就會立即執行。當cpu分配給它時間時,才開始執行run 方法 如果有的話 start 是方法,它呼叫run 方法....