回覆列表
  • 1 # 使用者7160410383855

    sleep()和wait()的區別 Java中的多執行緒是一種搶佔式的機制而不是分時機制。執行緒主要有以下幾種狀態:可執行,執行,阻塞,死亡。搶佔式機制指的是有多個執行緒處於可執行狀態,但是隻有一個執行緒在執行。 當有多個執行緒訪問共享資料的時候,就需要對執行緒進行同步。執行緒中的幾個主要方法的比較: Thread類的方法:sleep(),yield()等 Object的方法:wait()和notify()等 每個物件都有一個機鎖來控制同步訪問。Synchronized關鍵字可以和物件的機鎖互動,來實現執行緒的同步。 由於sleep()方法是Thread類的方法,因此它不能改變物件的機鎖。所以當在一個Synchronized方法中呼叫sleep()時,執行緒雖然休眠了,但是物件的機鎖沒有被釋放,其他執行緒仍然無法訪問這個物件。而wait()方法則會線上程休眠的同時釋放掉機鎖,其他執行緒可以訪問該物件。 Yield()方法是停止當前執行緒,讓同等優先權的執行緒執行。如果沒有同等優先權的執行緒,那麼Yield()方法將不會起作用。 一個執行緒結束的標誌是:run()方法結束。 一個機鎖被釋放的標誌是:synchronized塊或方法結束。 Wait()方法和notify()方法:當一個執行緒執行到wait()方法時(執行緒休眠且釋放機鎖),它就進入到一個和該物件相關的等待池中,同時失去了物件的機鎖。當它被一個notify()方法喚醒時,等待池中的執行緒就被放到了鎖池中。該執行緒從鎖池中獲得機鎖,然後回到wait()前的中斷現場。 join()方法使當前執行緒停下來等待,直至另一個呼叫join方法的執行緒終止。 值得注意的是:執行緒的在被啟用後不一定馬上就執行,而是進入到可執行執行緒的佇列中。 共同點: 他們都是在多執行緒的環境下,都可以在程式的呼叫處阻塞指定的毫秒數,並返回。 不同點: Thread.sleep(long)可以不在synchronized的塊下呼叫,而且使用Thread.sleep()不會丟失當前執行緒對任何物件的同步鎖(monitor); object.wait(long)必須在synchronized的塊下來使用,呼叫了之後失去對object的monitor, 這樣做的好處是它不影響其它的執行緒對object進行操作。

  • 中秋節和大豐收的關聯?
  • LGD2:0VG,神仙拉扯讓觀眾慨嘆“進化了”,表現在哪些方面?