第二篇:線程七種狀態


線程狀態

  • 初始化狀態
  • 就緒狀態
  • 運行狀態
  • 死亡狀態
  • 阻塞狀態
  • 超時等待
  • 等待狀態

    1.1 初始化狀態

        通過實現Runnable接口,new出來實例,線程進入初始化狀態

    1.2 就緒狀態

        初始化狀態調用start()方法,程序進入了就緒狀態。

            ①調用start(),sleep()結束,join()方法結束,調用yield()方法。

            ②某個線程拿到對象鎖,鎖池里的對象拿到對象鎖。

            ③當前時間片用完。

    1.3 運行狀態

        線程搶占到CPU資源。

    1.4 死亡狀態

        線程正常執行完、調用stop()方法、拋出異常或ERROR。

    1.5 阻塞狀態

        發生I/O輸入,進入同步代碼塊

    1.6 超時等待

        執行Thread.sleep()方法,此方法是Thread內的方法,會拋出異常。

    1.7 等待狀態

      調用Object里的wait()方法。

比較點 wait() sleep()
所屬類 Thread Object
控制資源 釋放資源,讓出CPU 不釋放資源,僅僅讓出CPU
方法結束時刻 調用notify()或notifyAll() 超時時間到
調用方法后線程狀態  線程釋放對象鎖,進入等待鎖池 指定時間不運行
方法調用結束后

等待notify()、或者notifyAll()同步方法執行完拿到鎖,

進入就緒狀態

方法調用結束,進入就緒狀態

    1.7 線程狀態的切換

 線程狀態切換中的方法說明

  1. start():調用start()方法會使得該線程開始執行,正確啟動線程的方式。
  2. wait():調用wait()方法,進入等待狀態,釋放資源,讓出CPU。需要在同步快中調用。
  3. sleep():調用sleep()方法,進入超時等待,不釋放資源,讓出CPU
  4. stop():調用sleep()方法,線程停止,線程不安全,不釋放鎖導致死鎖,過時。
  5. join():調用sleep()方法,線程是同步,它可以使得線程之間的並行執行變為串行執行。
  6. yield():暫停當前正在執行的線程對象,並執行其他線程,讓出CPU資源可能立刻獲得資源執行。
    yield()的目的是讓相同優先級的線程之間能適當的輪轉執行
  7. notify():在鎖池隨機喚醒一個線程。需要在同步快中調用。
  8. nnotifyAll():喚醒鎖池里所有的線程。需要在同步快中調用。

 線程狀態方法測試

/**
 * 測試yield()
 */
public class TestYield {
	public static void main(String[] args) {
		MyThread t1 = new MyThread("t1");
		MyThread t2 = new MyThread("t2");
		t1.start();
		t2.start();
	}
}

class MyThread extends Thread {
	MyThread(String s) {
		super(s);
	}

	public void run() {
		for (int i = 1; i <= 100; i++) {
			System.out.println(getName() + ":" + i);
			if (i == 0)
				yield();
		}
	}
}
t1:1
t2:1 ---t2執行
t1:2
t1:3
t1:4
t2:2

  

join()問題連接

/** * 測試join() */ public class JoinTest { public static void main(String [] args) throws InterruptedException { ThreadJoinTest t1 = new ThreadJoinTest("t1"); ThreadJoinTest t2 = new ThreadJoinTest("t2"); t1.start(); t1.join(); t2.start(); } } class ThreadJoinTest extends Thread{ public ThreadJoinTest(String name){ super(name); } @Override public void run(){ for(int i=0;i<10;i++){ System.out.println(this.getName() + ":" + i); } } } t1:9 t2:0 --t1執行完,t2才執行 t2:1 t2:2 t2:3 t2:4

join()可以帶參數:join(0)的意思不是A線程等待B線程0秒,而是A線程等待B線程無限時間,直到B線程執行完畢,即join(0)等價於join()。
join()必須在start()后,這樣才能同步。

  

 


免責聲明!

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



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