1. 程式人生 > >Java線程喚醒與阻塞常用方法有哪些?

Java線程喚醒與阻塞常用方法有哪些?

Java線程 Java學習 Java開發

如果線程是因為調用了wait()、sleep()或者join()方法而導致的阻塞,可以中斷線程,並且通過拋出InterruptedException來喚醒它;如果線程遇到了IO阻塞,無能為力,因為IO是操作系統實現的,Java代碼並沒有辦法直接接觸到操作系統。以下是詳細的喚醒方法:

  1. sleep() 方法

  sleep(毫秒),指定以毫秒為單位的時間,使線程在該時間內進入線程阻塞狀態,期間得不到cpu的時間片,等到時間過去了,線程重新進入可執行狀態。(暫停線程,不會釋放鎖)

  2.suspend() 和 resume() 方法:。

  掛起和喚醒線程,suspend e()使線程進入阻塞狀態,只有對應的resume e()被調用的時候,線程才會進入可執行狀態。(不建議用,容易發生死鎖)

  3. yield() 方法:

  會使的線程放棄當前分得的cpu時間片,但此時線程任然處於可執行狀態,隨時可以再次分得cpu時間片。yield()方法只能使同優先級的線程有執行的機會。調用 yield()的效果等價於調度程序認為該線程已執行了足夠的時間從而轉到另一個線程。(暫停當前正在執行的線程,並執行其他線程,且讓出的時間不可知)

  4.wait() 和 notify() 方法

  兩個方法搭配使用,wait()使線程進入阻塞狀態,調用notify()時,線程進入可執行狀態。wait()內可加或不加參數,加參數時是以毫秒為單位,當到了指定時間或調用notify()方法時,進入可執行狀態。(屬於Object類,而不屬於Thread類,wait()會先釋放鎖住的對象,然後再執行等待的動作。由於wait()所等待的對象必須先鎖住,因此,它只能用在同步化程序段或者同步化方法內,否則,會拋出異常IllegalMonitorStateException.)

  5.join()方法

  也叫線程加入。是當前線程A調用另一個線程B的join()方法,當前線程轉A入阻塞狀態,直到線程B運行結束,線程A才由阻塞狀態轉為可執行狀態。

  以上是Java線程喚醒和阻塞的五種常用方法,不同的方法有不同的特點,其中wait() 和 notify()是其中功能最強大、使用最靈活的方法,但這也導致了它們效率較低、較容易出錯的特性,因此,在實際應用中應靈活運用各種方法,以達到期望的目的與效果!

Java線程喚醒與阻塞常用方法有哪些?