奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

java語言

Java wait(),yield(),sleep()的區別

時間:2024-09-24 10:56:45 java語言 我要投稿
  • 相關推薦

Java wait(),yield(),sleep()的區別

  導語:Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。下面我們來看看Java wait(),yield(),sleep()的區別,希望對大家有所幫助。

  1、sleep()

  使當前線程(即調用該方法的線程)暫停執行一段時間,讓其他線程有機會繼續執行,但它并不釋放對象鎖。也就是說如果有synchronized同步快,其他線程仍然不能訪問共享數據。注意該方法要捕捉異常。

  例如有兩個線程同時執行(沒有synchronized)一個線程優先級為MAX_PRIORITY,另一個為MIN_PRIORITY,如果沒有Sleep()方法,只有高優先級的線程執行完畢后,低優先級的線程才能夠執行;但是高優先級的線程sleep(500)后,低優先級就有機會執行了。

  總之,sleep()可以使低優先級的線程得到執行的機會,當然也可以讓同優先級、高優先級的線程有執行的機會。

  2、join()

  join()方法使調用該方法的線程在此之前執行完畢,也就是等待該方法的線程執行完畢后再往下繼續執行。注意該方法也需要捕捉異常。

  3、yield()

  該方法與sleep()類似,只是不能由用戶指定暫停多長時間,并且yield()方法只能讓同優先級的線程有執行的機會。

  4、wait()和notify()、notifyAll()

  這三個方法用于協調多個線程對共享數據的存取,所以必須在synchronized語句塊內使用。synchronized關鍵字用于保護共享數據,阻止其他線程對共享數據的存取,但是這樣程序的流程就很不靈活了,如何才能在當前線程還沒退出synchronized數據塊時讓其他線程也有機會訪問共享數據呢?此時就用這三個方法來靈活控制。

  wait()方法使當前線程暫停執行并釋放對象鎖標示,讓其他線程可以進入synchronized數據塊,當前線程被放入對象等待池中。當調用notify()方法后,將從對象的等待池中移走一個任意的線程并放到鎖標志等待池中,只有鎖標志等待池中線程能夠獲取鎖標志;如果鎖標志等待池中沒有線程,則notify()不起作用。

  notifyAll()則從對象等待池中移走所有等待那個對象的線程并放到鎖標志等待池中。

  注意 這三個方法都是java.lang.Object的方法。

  二、run和start()

  把需要處理的代碼放到run()方法中,start()方法啟動線程將自動調用run()方法,這個由java的內存機制規定的。并且run()方法必需是public訪問權限,返回值類型為void。

  三、關鍵字synchronized

  該關鍵字用于保護共享數據,當然前提條件是要分清哪些數據是共享數據。每個對象都有一個鎖標志,當一個線程訪問到該對象,被Synchronized修飾的數據將被”上鎖”,阻止其他線程訪問。當前線程訪問完這部分數據后釋放鎖標志,其他線程就可以訪問了。

  四、wait()和notify(),notifyAll()是Object類的方法,sleep()和yield()是Thread類的方法。

  (1)、常用的wait方法有wait()和wait(long timeout);

  void wait() 在其他線程調用此對象的 notify() 方法或者 notifyAll()方法前,導致當前線程等待。

  void wait(long timeout)在其他線程調用此對象的notify() 方法 或者 notifyAll()方法,或者超過指定的時間量前,導致當前線程等待。

  wait()后,線程會釋放掉它所占有的“鎖標志”,從而使線程所在對象中的其他shnchronized數據可被別的線程使用。

  wait()h和notify()因為會對對象的“鎖標志”進行操作,所以他們必需在Synchronized函數或者 synchronized block 中進行調用。如果在non-synchronized 函數或 non-synchronized block 中進行調用,雖然能編譯通過,但在運行時會發生IllegalMonitorStateException的異常。。

  (2)、Thread.sleep(long millis)必須帶有一個時間參數。

  sleep(long)使當前線程進入停滯狀態,所以執行sleep()的線程在指定的時間內肯定不會被執行;

  sleep(long)可使優先級低的線程得到執行的機會,當然也可以讓同優先級的線程有執行的機會;

  sleep(long)是不會釋放鎖標志的。

  (3)、yield()沒有參數

  sleep 方法使當前運行中的線程睡眠一段時間,進入不可以運行狀態,這段時間的長短是由程序設定的,yield方法使當前線程讓出CPU占有權,但讓出的時間是不可設定的。

  yield()也不會釋放鎖標志。

  實際上,yield()方法對應了如下操作;先檢測當前是否有相同優先級的線程處于同可運行狀態,如有,則把CPU的占有權交給次線程,否則繼續運行原來的線程,所以yield()方法稱為“退讓”,它把運行機會讓給了同等級的其他線程。

  sleep 方法允許較低優先級的線程獲得運行機會,但yield()方法執行時,當前線程仍處在可運行狀態,所以不可能讓出較低優先級的線程此時獲取CPU占有權。在一個運行系統中,如果較高優先級的線程沒有調用sleep方法,也沒有受到I/O阻塞,那么較低優先級線程只能等待所有較高優先級的線程運行結束,方可有機會運行。

  yield()只是使當前線程重新回到可執行狀態,所有執行yield()的線程有可能在進入到可執行狀態后馬上又被執行,所以yield()方法只能使同優先級的線程有執行的機會。

【Java wait(),yield(),sleep()的區別】相關文章:

JavaScript與Java的區別08-22

C語言與JAVA的區別07-07

java的繼承與組合的區別07-19

Java和PHP的區別09-09

java和js的區別08-05

java集合數組的區別08-17

Java中定義與聲明的區別05-21

Java和C語言的區別07-28

C語言與JAVA理論區別10-25

Java與C/C++的區別06-18

主站蜘蛛池模板: 林西县| 千阳县| 讷河市| 太仓市| 钦州市| 黄梅县| 麟游县| 拉萨市| 迁西县| 泾川县| 饶河县| 永福县| 拜泉县| 财经| 靖远县| 基隆市| 通辽市| 苍梧县| 边坝县| 鸡东县| 白河县| 嘉鱼县| 台湾省| 江阴市| 芮城县| 屯昌县| 西充县| 武陟县| 清原| 津市市| 邢台市| 千阳县| 思茅市| 长白| 肃北| 张家界市| 静海县| 汝州市| 安义县| 文成县| 金堂县|