av手机免费在线观看,国产女人在线视频,国产xxxx免费,捆绑调教一二三区,97影院最新理论片,色之久久综合,国产精品日韩欧美一区二区三区

java語(yǔ)言

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

時(shí)間:2025-01-14 19:57:01 java語(yǔ)言 我要投稿
  • 相關(guān)推薦

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

  導(dǎo)語(yǔ):Java是一門(mén)面向?qū)ο缶幊陶Z(yǔ)言,不僅吸收了C++語(yǔ)言的各種優(yōu)點(diǎn),還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語(yǔ)言具有功能強(qiáng)大和簡(jiǎn)單易用兩個(gè)特征。下面我們來(lái)看看Java wait(),yield(),sleep()的區(qū)別,希望對(duì)大家有所幫助。

  1、sleep()

  使當(dāng)前線(xiàn)程(即調(diào)用該方法的線(xiàn)程)暫停執(zhí)行一段時(shí)間,讓其他線(xiàn)程有機(jī)會(huì)繼續(xù)執(zhí)行,但它并不釋放對(duì)象鎖。也就是說(shuō)如果有synchronized同步快,其他線(xiàn)程仍然不能訪問(wèn)共享數(shù)據(jù)。注意該方法要捕捉異常。

  例如有兩個(gè)線(xiàn)程同時(shí)執(zhí)行(沒(méi)有synchronized)一個(gè)線(xiàn)程優(yōu)先級(jí)為MAX_PRIORITY,另一個(gè)為MIN_PRIORITY,如果沒(méi)有Sleep()方法,只有高優(yōu)先級(jí)的線(xiàn)程執(zhí)行完畢后,低優(yōu)先級(jí)的線(xiàn)程才能夠執(zhí)行;但是高優(yōu)先級(jí)的線(xiàn)程sleep(500)后,低優(yōu)先級(jí)就有機(jī)會(huì)執(zhí)行了。

  總之,sleep()可以使低優(yōu)先級(jí)的線(xiàn)程得到執(zhí)行的機(jī)會(huì),當(dāng)然也可以讓同優(yōu)先級(jí)、高優(yōu)先級(jí)的線(xiàn)程有執(zhí)行的機(jī)會(huì)。

  2、join()

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

  3、yield()

  該方法與sleep()類(lèi)似,只是不能由用戶(hù)指定暫停多長(zhǎng)時(shí)間,并且yield()方法只能讓同優(yōu)先級(jí)的線(xiàn)程有執(zhí)行的機(jī)會(huì)。

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

  這三個(gè)方法用于協(xié)調(diào)多個(gè)線(xiàn)程對(duì)共享數(shù)據(jù)的存取,所以必須在synchronized語(yǔ)句塊內(nèi)使用。synchronized關(guān)鍵字用于保護(hù)共享數(shù)據(jù),阻止其他線(xiàn)程對(duì)共享數(shù)據(jù)的存取,但是這樣程序的流程就很不靈活了,如何才能在當(dāng)前線(xiàn)程還沒(méi)退出synchronized數(shù)據(jù)塊時(shí)讓其他線(xiàn)程也有機(jī)會(huì)訪問(wèn)共享數(shù)據(jù)呢?此時(shí)就用這三個(gè)方法來(lái)靈活控制。

  wait()方法使當(dāng)前線(xiàn)程暫停執(zhí)行并釋放對(duì)象鎖標(biāo)示,讓其他線(xiàn)程可以進(jìn)入synchronized數(shù)據(jù)塊,當(dāng)前線(xiàn)程被放入對(duì)象等待池中。當(dāng)調(diào)用notify()方法后,將從對(duì)象的等待池中移走一個(gè)任意的線(xiàn)程并放到鎖標(biāo)志等待池中,只有鎖標(biāo)志等待池中線(xiàn)程能夠獲取鎖標(biāo)志;如果鎖標(biāo)志等待池中沒(méi)有線(xiàn)程,則notify()不起作用。

  notifyAll()則從對(duì)象等待池中移走所有等待那個(gè)對(duì)象的線(xiàn)程并放到鎖標(biāo)志等待池中。

  注意 這三個(gè)方法都是java.lang.Object的方法。

  二、run和start()

  把需要處理的代碼放到run()方法中,start()方法啟動(dòng)線(xiàn)程將自動(dòng)調(diào)用run()方法,這個(gè)由java的內(nèi)存機(jī)制規(guī)定的。并且run()方法必需是public訪問(wèn)權(quán)限,返回值類(lèi)型為void。

  三、關(guān)鍵字synchronized

  該關(guān)鍵字用于保護(hù)共享數(shù)據(jù),當(dāng)然前提條件是要分清哪些數(shù)據(jù)是共享數(shù)據(jù)。每個(gè)對(duì)象都有一個(gè)鎖標(biāo)志,當(dāng)一個(gè)線(xiàn)程訪問(wèn)到該對(duì)象,被Synchronized修飾的數(shù)據(jù)將被”上鎖”,阻止其他線(xiàn)程訪問(wèn)。當(dāng)前線(xiàn)程訪問(wèn)完這部分?jǐn)?shù)據(jù)后釋放鎖標(biāo)志,其他線(xiàn)程就可以訪問(wèn)了。

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

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

  void wait() 在其他線(xiàn)程調(diào)用此對(duì)象的 notify() 方法或者 notifyAll()方法前,導(dǎo)致當(dāng)前線(xiàn)程等待。

  void wait(long timeout)在其他線(xiàn)程調(diào)用此對(duì)象的notify() 方法 或者 notifyAll()方法,或者超過(guò)指定的時(shí)間量前,導(dǎo)致當(dāng)前線(xiàn)程等待。

  wait()后,線(xiàn)程會(huì)釋放掉它所占有的“鎖標(biāo)志”,從而使線(xiàn)程所在對(duì)象中的其他shnchronized數(shù)據(jù)可被別的線(xiàn)程使用。

  wait()h和notify()因?yàn)闀?huì)對(duì)對(duì)象的“鎖標(biāo)志”進(jìn)行操作,所以他們必需在Synchronized函數(shù)或者 synchronized block 中進(jìn)行調(diào)用。如果在non-synchronized 函數(shù)或 non-synchronized block 中進(jìn)行調(diào)用,雖然能編譯通過(guò),但在運(yùn)行時(shí)會(huì)發(fā)生IllegalMonitorStateException的異常。。

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

  sleep(long)使當(dāng)前線(xiàn)程進(jìn)入停滯狀態(tài),所以執(zhí)行sleep()的線(xiàn)程在指定的時(shí)間內(nèi)肯定不會(huì)被執(zhí)行;

  sleep(long)可使優(yōu)先級(jí)低的線(xiàn)程得到執(zhí)行的機(jī)會(huì),當(dāng)然也可以讓同優(yōu)先級(jí)的線(xiàn)程有執(zhí)行的機(jī)會(huì);

  sleep(long)是不會(huì)釋放鎖標(biāo)志的。

  (3)、yield()沒(méi)有參數(shù)

  sleep 方法使當(dāng)前運(yùn)行中的線(xiàn)程睡眠一段時(shí)間,進(jìn)入不可以運(yùn)行狀態(tài),這段時(shí)間的長(zhǎng)短是由程序設(shè)定的,yield方法使當(dāng)前線(xiàn)程讓出CPU占有權(quán),但讓出的時(shí)間是不可設(shè)定的。

  yield()也不會(huì)釋放鎖標(biāo)志。

  實(shí)際上,yield()方法對(duì)應(yīng)了如下操作;先檢測(cè)當(dāng)前是否有相同優(yōu)先級(jí)的線(xiàn)程處于同可運(yùn)行狀態(tài),如有,則把CPU的占有權(quán)交給次線(xiàn)程,否則繼續(xù)運(yùn)行原來(lái)的線(xiàn)程,所以yield()方法稱(chēng)為“退讓”,它把運(yùn)行機(jī)會(huì)讓給了同等級(jí)的其他線(xiàn)程。

  sleep 方法允許較低優(yōu)先級(jí)的線(xiàn)程獲得運(yùn)行機(jī)會(huì),但yield()方法執(zhí)行時(shí),當(dāng)前線(xiàn)程仍處在可運(yùn)行狀態(tài),所以不可能讓出較低優(yōu)先級(jí)的線(xiàn)程此時(shí)獲取CPU占有權(quán)。在一個(gè)運(yùn)行系統(tǒng)中,如果較高優(yōu)先級(jí)的線(xiàn)程沒(méi)有調(diào)用sleep方法,也沒(méi)有受到I/O阻塞,那么較低優(yōu)先級(jí)線(xiàn)程只能等待所有較高優(yōu)先級(jí)的線(xiàn)程運(yùn)行結(jié)束,方可有機(jī)會(huì)運(yùn)行。

  yield()只是使當(dāng)前線(xiàn)程重新回到可執(zhí)行狀態(tài),所有執(zhí)行yield()的線(xiàn)程有可能在進(jìn)入到可執(zhí)行狀態(tài)后馬上又被執(zhí)行,所以yield()方法只能使同優(yōu)先級(jí)的線(xiàn)程有執(zhí)行的機(jī)會(huì)。

【Java wait(),yield(),sleep()的區(qū)別】相關(guān)文章:

Java與Java web的區(qū)別09-30

JavaScript與Java的區(qū)別08-22

Java與JavaScript的區(qū)別10-21

java與php的區(qū)別06-05

Java堆棧的區(qū)別08-12

JavaScript與java語(yǔ)言的區(qū)別10-06

C語(yǔ)言與JAVA的區(qū)別07-07

java和js的區(qū)別08-05

Java和PHP的區(qū)別09-09