認識thread的start和run
1) start:
用 start方法來啟動執行緒,真正實現了多執行緒執行,這時無需等待run方法體**執行完畢而直接繼續執行下面的**。通過呼叫thread類的 start()方法來啟動乙個執行緒,這時此執行緒處於就緒(可執行)狀態,並沒有執行,一旦得到cpu時間片,就開始執行run()方法,這裡方法 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時間片;
﹒ 當執行緒呼叫wait()方法後會進入等待佇列(進入這個狀態會釋放所占有的所有資源,與阻塞狀態不同),進入這個狀態後,是不能自動喚醒的,必須依靠其他 執行緒呼叫notify()或notifyall()方法才能被喚醒(由於notify()只是喚醒乙個執行緒,但我們由不能確定具體喚醒的是哪乙個執行緒,也 許我們需要喚醒的執行緒不能夠被喚醒,因此在實際使用時,一般都用notifyall()方法,喚醒有所執行緒),執行緒被喚醒後會進入鎖池,等待獲取鎖標記。
﹒當執行緒呼叫stop方法,即可使執行緒進入消亡狀態,但是由於stop方法是不安全的,不鼓勵使用,大家可以通過run方法裡的條件變通實現執行緒的 stop。
Thread中start和run方法的區別
呼叫start 方法會建立乙個新的子執行緒並啟動 呼叫run 方法只是thread的乙個普通方法呼叫 public class threadtest public static void main string args system.out.println 當前主線程是 thread.curren...
Thread中run和start方法的模板設計模式
建立乙個thread需要繼承thread重寫run方法或者實現runnable介面中的run方法,其實兩者都是一樣因為thread也繼承了runnable介面。實現了run方法,但是啟動確實用start方法,那麼這是為什麼?thread使用模板設計模式,執行緒控制的邏輯交給thread自己,而實現的...
Thread中start和run方法的區別
public class threadtest public static void main string args system.out.println 這裡是main方法 thread.currentthread getname t.run t.start 呼叫run方法出現的結果 呼叫sta...