Thread 的幾個概念sleep、wait、yield、interrupt

  

 

yield和sleep的區別

JDK1.5.0的API文檔裏的描述:java

yield:Causes the currently executing thread object to temporarily pause and allow other threads to execute.緩存

sleep:Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds.函數

根本無助於理解二者間的差異oop

 

線程的生命週期裏有三個狀態Runable、Blocked、Runningthis

yield:Running  ->  Runablespa

sleep: Running -> Blocked -> Runable.net

yield和sleep都是在線程處於Running的時候開始的,yield只是讓出分配給本身的CPU時間片,而且會馬上進入Runable狀態參與CPU時間的競爭,若程序中沒有其餘線程,那麼該線程立刻就會開始往下執行;sleep會進入Blocked狀態,等待時間結束事件的發生,而後進入Runable狀態參與CPU時間的競爭線程

調用yield的時候鎖並無被釋放code

 

另外,sleep和yield都不具有同步語義,也就是說編譯器在執行sleep或yield方法以前和以後,都沒有強制要求同步本地緩存與主存的數據對象

如下摘自JSL3.0

 

 

It is important to note that neither Thread.sleep nor Thread.yield have

any synchronization semantics. In particular, the compiler does not have to flush

writes cached in registers out to shared memory before a call to Thread.sleep or

Thread.yield, nor does the compiler have to reload values cached in registers

after a call to Thread.sleep or Thread.yield.

 

 

For example, in the following (broken) code fragment, assume that this.done is a non-volatile

boolean field:

 

[java] view plaincopy

  1. while (!this.done)  
  2.     Thread.sleep(1000);  

 

 

The compiler is free to read the field this.done just once, and reuse the cached value

in each execution of the loop. This would mean that the loop would never terminate, even if

another thread changed the value of this.done.

 

 

 

sleep:在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操做受到系統計時器和調度程序精度和準確性的影響。該線程不丟失任何監視器的所屬權。 
經過調用sleep使任務進入休眠狀態,在這種狀況下,任務在指定的時間內不會運行。
調用sleep的時候鎖並無被釋放。
休眠 
Java SE5引入了更加顯示的sleep()版本做爲TimeUnit類的一部分,這個方法容許你指定sleep()延遲的時間單元,所以能夠提供更好的可閱讀性。TimeUnit還能夠被用來執行轉換,就想稍後你會在本書中看到的那樣。 

wait:調用wait使線程掛起,知道線程獲得了notify或notifyAll消息,線程纔會進入就緒狀態。
使你能夠等待某個條件發生變化,而改變這個條件超出了當前方法的控制能力。
線程的執行被掛起,對象上的鎖被釋放。意味着另外一個任務能夠得到這個鎖。所以在改對象中的其餘synchronized方法能夠在wait期間被調用。
就意味着生命「我已經剛剛作完能作的全部事情,所以我要在這裏等待,可是我但願其餘synchronized操做在條件適合的狀況下才可以執行」

yield:若是知道已經完成了在run()方法的循環的一次迭代過程當中所須要的工做,就能夠給線程調度一個機制暗示:個人工做已經作的差很少了,可讓給別的線程使用CPU了。經過調用yield()來實現。
當調用yield時,你也是在建議具備相同優先級的其餘線程能夠運行。
對於任何重要的控制或在調整應用時,都不恩那個依賴於yield。實際上,yield常常被誤用。
(yield並不意味着退出和暫停,只是,告訴線程調度若是有人須要,能夠先拿去,我過會再執行,沒人須要,我繼續執行)
調用yield的時候鎖並無被釋放。

interrupt:中斷線程。
中斷 
Thread.interrupt()或者新類庫裏面經過Executor的submit()來得到Future<?>返回值,這個Future提供cancel()以中止這個線程。 
Thread類包含interrupt()方法,所以你能夠終於被阻塞的任務,這個方法將設置線程的中斷狀態。若是一個線程已經被阻塞,或者視圖執行一個阻塞操做,那麼設置這個線程的終端狀態將拋出InterruptedException。當拋出該異常或者該任何調用Thread.interrupted()時,中斷狀態將復位。
你在Executor上調用shutdownNow(),那麼它將發送一個interrupt()調用給他啓動的全部線程。

 

 

1.sleep()方法

在指定時間內讓當前正在執行的線程暫停執行,但不會釋放「鎖標誌」。不推薦使用。

sleep()使當前線程進入阻塞狀態,在指定時間內不會執行。

2.wait()方法

在其餘線程調用對象的notify或notifyAll方法前,致使當前線程等待。線程會釋放掉它所佔有的「鎖標誌」,從而使別的線程有機會搶佔該鎖。

當前線程必須擁有當前對象鎖。若是當前線程不是此鎖的擁有者,會拋出IllegalMonitorStateException異常。

喚醒當前對象鎖的等待線程使用notify或notifyAll方法,也必須擁有相同的對象鎖,不然也會拋出IllegalMonitorStateException異常。

waite()和notify()必須在synchronized函數或synchronized block中進行調用。若是在non-synchronized函數或non-synchronized block中進行調用,雖然能編譯經過,但在運行時會發生IllegalMonitorStateException的異常。

3.yield方法

暫停當前正在執行的線程對象。

yield()只是使當前線程從新回到可執行狀態,因此執行yield()的線程有可能在進入到可執行狀態後立刻又被執行。

yield()只能使同優先級或更高優先級的線程有執行的機會。 

4.join方法

等待該線程終止。

等待調用join方法的線程結束,再繼續執行。如:t.join();//主要用於等待t線程運行結束,若無此句,main則會執行完畢,致使結果不可預測。

publicclass Test {         publicstaticvoid main(String[] args) {                 Thread t1 = new MyThread1();                 t1.start();                  for (int i = 0; i < 20; i++) {                         System.out.println("主線程第" + i +"次執行!");                         if (i > 2)try {                                  //t1線程合併到主線程中,主線程中止執行過程,轉而執行t1線程,直到t1執行完畢後繼續。                                 t1.join();                          } catch (InterruptedException e) {                                 e.printStackTrace();                          }                  }          }  }  class MyThread1 extends Thread {          publicvoid run() {                 for (int i = 0; i < 10; i++) {                         System.out.println("線程1第" + i + "次執行!");                 }          }  }

相關文章
相關標籤/搜索