1. 程式人生 > >執行緒中sleep()方法和Object類中的wait()方法的區別

執行緒中sleep()方法和Object類中的wait()方法的區別

這兩者的施加者是有本質區別的.

sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我的流程來控制.

wait(),首先,這是由某個確定的物件來呼叫的,將這個物件理解成一個傳話的人,當這個人在某個執行緒裡面說"暫停!",也是 thisOBJ.wait(),這裡的暫停是阻塞,還是"點火->燒水->煮飯",thisOBJ就好比一個監督我的人站在我旁邊,本來該線 程應該執行1後執行2,再執行3,而在2處被那個物件喊暫停,那麼我就會一直等在這裡而不執行3,但正個流程並沒有結束,我一直想去煮飯,但還沒被允許, 直到那個物件在某個地方說"通知暫停的執行緒啟動!",也就是thisOBJ.notify()的時候,那麼我就可以煮飯了,這個被暫停的執行緒就會從暫停處 繼續執行.

其實兩者都可以讓執行緒暫停一段時間,但是本質的區別是一個執行緒的執行狀態控制,一個是執行緒之間的通訊的問題

java.lang.Thread類中,提供了sleep(),

java.lang.Object類中提供了wait(), notify()和notifyAll()方法來操作執行緒

sleep()可以將一個執行緒睡眠,引數可以指定一個時間。

wait()可以將一個執行緒掛起,直到超時或者該執行緒被喚醒。

wait有兩種形式wait()和wait(milliseconds).

sleep和wait的區別有:

1,這兩個方法來自不同的類分別是Thread和Object

2,最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他執行緒可以使用同步控制塊或者方法。

3,wait,notify和notifyAll只能在同步控制方法或者同步控制塊裡面使用,而sleep可以在

任何地方使用

synchronized(x){

x.notify()

//或者wait()

}

4,sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常

相關推薦

執行sleep方法Objectwait方法區別

這兩者的施加者是有本質區別的. sleep()是讓某個執行緒暫停執行一段時間,其控制範圍是由當前執行緒決定,也就是說,線上程裡面決定.好比如說,我要做的事情是 "點火->燒水->煮麵",而當我點完火之後我不立即燒水,我要休息一段時間再燒.對於執行的主動權是由我

關於String的equals方法Object的equals方法

首先,得看看Object類的equals,畢竟人家Object類是老大嘛 有圖有真相,看看原始碼 這就是最原始的equals方法,他比較的兩個物件的本身的儲存地址,例如下面 宣告一下,Company這個類並沒有重寫equals方法,所以Object類它本身比較的是物件的實際地

String的equals方法Objectequals方法區別

今天在無意中發現一個小知識點,難度不大就是簡單和大家分享一下。 String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1.equals(str2));//true

Java併發程式設計基礎//程序:每個程序都有獨立的程式碼資料空間程序上下文,程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼資料空間,每個執行緒擁有獨立的執行棧程式計

1.實現多執行緒的兩種方式: (1)繼承Thread類; (2)實現Runnable介面 //程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行

多程序與多執行--Linux 執行模型的比較:LinuxThreads NPTL(轉)

當 Linux 最初開發時,在核心中並不能真正支援執行緒。但是它的確可以通過 clone() 系統呼叫將程序作為可排程的實體。這個呼叫建立了呼叫程序(calling process)的一個拷貝,這個拷貝與呼叫程序共享相同的地址空間。LinuxThreads 專案使用這個呼叫來完全在使用者空間模擬對執行緒的支援

java執行睡眠sleep()方法介紹

1、方法介紹    sleep(long millis)  執行緒睡眠 millis 毫秒    sleep(long millis, int nanos)  執行緒睡眠 millis 毫秒 + nanos 納秒2、如何呼叫sleep    因為sleep()是靜態方法,所以

java多執行併發系列之閉鎖(Latch)柵欄CyclicBarrier

-閉鎖(Latch) 閉鎖(Latch):一種同步方法,可以延遲執行緒的進度直到執行緒到達某個終點狀態。通俗的講就是,一個閉鎖相當於一扇大門,在大門開啟之前所有執行緒都被阻斷,一旦大門開啟所有執行緒都將通過,但是一旦大門開啟,所有執行緒都通過了,那麼這個閉鎖的狀態就失效了,門

執行sleep()方法yield()方法有什麼區別?

1.sleep()方法給其他執行緒執行機會時不考慮執行緒的優先順序,因此會給低優先順序的執行緒以執行的機會2.yield()方法只會給相同優先順序或更高優先順序的執行緒以執行的機會3.執行緒執行sleep()方法後轉入阻塞(blocked)狀態,而執行yield()方法後轉入

執行sleep()方法yield()方法有什麼區別

① sleep()方法給其他執行緒執行機會時不考慮執行緒的優先順序,因此會給低優先順序的執行緒以執行的機會;yield()方法只會給相同優先順序或更高優先順序的執行緒以執行的機會;② 執行緒執行slee

執行sleep()、wait()、yield()join()方法

  1.sleep()和wait()         這兩個方法都可以讓呼叫它的執行緒沉睡(sleep)/停止執行(wait)指定的時間,到了這個時間,執行緒就會自動醒來,變為可執行狀態(RUNNABLE)。        public static native vo

執行睡眠sleep()方法執行讓步yield()方法的主要區別

 import java.util.*; public class SleepTest {  public static void main(String[] args) throws Exception  {   for (int i=0; i<10; i++)

執行、程序、協程GIL

上一篇文章介紹了:建立縣城的兩種方式、Event物件判斷執行緒是否啟動、利用訊號量控制執行緒併發。 部落格連結:執行緒、程序、協程和GIL(二) 這一篇來說說執行緒間通訊的那些事兒:    一個執行緒向另一個執行緒傳送資料最安全的方式就是使用queue庫中的隊列了,通過建立一個供多個執行緒共享

ObjecthashCode()equals()方法詳解附圖

 下圖是規範中要求的: 圖解:比如equals相等的箭頭指向hashcode相等,標示equals相等那麼必有hashcode相等。另外有兩個箭頭指向別人的標示可能是其中之一。 //JAVA程式碼: public static void main

Java併發庫五、六、七執行範圍內共享資料、ThreadLocal、共享資料的三種方法

深切懷念傳智播客張孝祥老師,特將其代表作——Java併發庫視訊研讀兩遍,受益頗豐,記以後閱 05. 執行緒範圍內共享變數的概念與作用 執行緒範圍內共享資料圖解: 程式碼演示: class ThreadScopeShareData {        三個模組共享資料,主執

Android : 執行的結束,掛起恢復

實踐證明,上述情況下,建立的執行緒並不會自動銷燬,而是仍然在後臺默默無聞地執行,直到自行結束。Android的這種設計是無可厚非的。從理論上來解釋,應用的最小執行單位是執行緒,最小資源單位是程序,一個程序可以包含多個執行緒,而多個執行緒共享同一個所屬程序的資源。因此,個人理解Android的應用其實就是一個程

C語言存儲類別又分為四:自動auto、靜態static、寄存器的register外部的extern

字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適

TCP協議的三次握手四次揮手(圖解)

繼續 丟失 get 所有 如果 idt 請求報文 網絡 center 轉自:http://blog.csdn.net/whuslei/article/details/6667471 建立TCP需要三次握手才能建立,而斷開連接則需要四次握手。整個過程如下圖所示: 先來看看如

day4繼承、修飾符、方法的重寫、super關鍵詞、繼承的構造方法object、對象轉型

編程 權限 數列 als str list 兩個 instance 變量 1.類的繼承(extends)通過繼承,子類自動擁有父類的所有成員(成員變量和成員發方法)一個子類只能有一個父類,一個父類可以派生多個子類 2.訪問修飾符(private 默認 protected

《軟件測試方法技術》-讀書筆記

圖片 軟件工程 AI 開發 支持 ont 3年 發的 一次 軟件測試正反兩方面的爭辯 軟件測試領域先驅 Bill Hetzel 博士 1993年在美國的北卡羅來納大學組織了歷史上第一次正式的關於軟件測試的會議。從此以後,軟件測試開始頻繁出現在軟件工程的研究和實踐中,也可以認

resultMap自定義映射---8.3.1. 解決列名的字段名稱實體的屬性名不一致

lec per 編寫 動態代理 參數類型 ID res HERE 用戶 1.1.1.1. 步驟一:將駝峰匹配註釋掉 --------------測試完成後仍然 回來開啟 其他地方可能用到 一旦註釋掉駝峰匹配,那麽再通過queryUserById查詢的結果中,用戶