java執行緒
呼叫thread.start()方法,是讓執行緒處於可執行狀態
讓執行緒暫時離開執行狀態的三中方法:
1、呼叫執行緒的sleep()方法,使執行緒睡眠一段時間
2、呼叫執行緒的yield()方法,使執行緒暫時回到可執行狀態,來使其他執行緒有機會執行。
3、呼叫執行緒的join()方法,使當前執行緒停止執行,知道當前執行緒中加入的執行緒執行完畢後,當前執行緒才可以執行。
理解 執行緒的yield()方法:讓一個執行的執行緒,執行緒鎖,處於可執行狀態
1:執行緒讓出處理器資源,讓處理器執行其他執行緒(也包括再次執行當前執行緒,jvm是隨機選擇可執行執行緒的)
2:讓執行緒由執行狀態轉到可執行狀態
3:JVM的排程程式隨機選擇處於可執行狀態的執行緒來執行,此時可能有兩種執行過程:(1)選擇一個執行緒執行,直到此執行緒阻塞或者執行到死亡。(2)時間分片機制,為執行緒池中的每個執行緒都提供均勻的執行機會。
理解 執行緒的 sleep()方法:讓當前執行的執行緒,處於睡眠,時間過後處於可執行狀態,在此期間不釋放執行緒鎖
、1執行緒處於睡眠狀態時,JVM排程程式會暫停此執行緒的執行並來執行其他的處於可執行狀態的執行緒。
2:Thread .sleep() 的作用是使當前執行的執行緒處於睡眠狀態,而不是Thread物件(sleep,是Thread類的靜態方法)
理解:執行緒的join()(非靜態方法):讓一個執行緒b 加入到執行緒A的尾部,等執行緒A,執行完畢後再繼續執行,
1:相當於:一個B方法裡在執行A方法,A方法結束後,繼續執行B未執行完的程式碼
2:main執行緒只等1000毫秒,不管T什麼時候結束.
- public class JoinTest implements Runnable{
- public static int a = 0;
- public void run() {
- for (int k = 0; k < 5; k++) {
- a = a + 1;
- }
- }
- public static void main(String[] args) throws Exception {
- Runnable r = new JoinTest();
- Thread t = new Thread(r);
- t.start();
- System.out.println(a);
- }
- }
- public static void main(String[] args) throws Exception {
- Runnable r = new JoinTest();
- Thread t = new Thread(r);
- t.start();
- t.join(); //加入join()
- System.out.println(a);
- }
這個時候,程式輸入結果始終為5。
為了證明如果不使用t.join()方法,主執行緒main方法的System.out.println(a);語句將搶先執行,我們可以在main方法中加入一個迴圈,這個迴圈用來延長main方法執行的時間,迴圈次數將嚴重取決於機器效能。如果迴圈次數得當,我們也可以看到a的輸出結果是5。
- public static void main(String[] args) throws Exception {
- Runnable r = new JoinTest();
- Thread t = new Thread(r);
- t.start();
- //t.join(); //加入join()
- /*
- 注意迴圈體內一定要有實際執行語句,否則編譯器或JVM可能優化掉你的這段程式碼,視這段代
- 碼為無效。
- */
- for (int i=0; i<300; i++) {
- System.out.print(i);
- }
- System.out.println();
- System.out.println(a);
- }
經自己測試,最後a一直是5.
synchronized (thread),獲取執行緒物件t的鎖,並Sleep(9000)後釋放,這就意味著,即使
main方法t.join(1000),等待一秒鐘,它必須等待ThreadTest 執行緒釋放t鎖後才能進入wait方法中,它實際等待時間是9000+1000 MS
其實Join方法實現是通過wait(小提示:Object 提供的方法)。 當main執行緒呼叫t.join時候,main執行緒會獲得執行緒物件t的鎖(wait 意味著拿到該物件的鎖),呼叫該物件的wait(等待時間),直到該物件喚醒main執行緒,比如退出後。
每個執行緒都有一個執行緒棧
相關文章
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- java執行緒執行緒休眠,sleep方法Java執行緒
- Java執行緒篇——執行緒的開啟Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- java 執行緒池Java執行緒
- Java執行緒池Java執行緒
- java——多執行緒Java執行緒
- java 停止執行緒Java執行緒
- java多執行緒Java執行緒
- Java與執行緒Java執行緒
- Java - 多執行緒Java執行緒
- Java執行緒安全Java執行緒
- java 多執行緒Java執行緒
- Java多執行緒學習(3)執行緒同步與執行緒通訊Java執行緒
- Java多執行緒學習——執行緒通訊Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- Java 多執行緒基礎(四)執行緒安全Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java 併發:執行緒、執行緒池和執行器全面教程Java執行緒
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- 玩轉java多執行緒 之多執行緒基礎 執行緒狀態 及執行緒停止實戰Java執行緒
- Java多執行緒之守護執行緒實戰Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 深入淺出Java多執行緒(十二):執行緒池Java執行緒