少年阿賓

          那些青春的歲月

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          這兩個(gè)方法主要來(lái)源是,sleep用于線程控制,而wait用于線程間的通信,與wait配套的方法還有notify和notifyAll.

          區(qū)別一:

          sleep是Thread類的方法,是線程用來(lái) 控制自身流程的,比如有一個(gè)要報(bào)時(shí)的線程,每一秒中打印出一個(gè)時(shí)間,那么我就需要在print方法前面加上一個(gè)sleep讓自己每隔一秒執(zhí)行一次。就像個(gè)鬧鐘一樣。

          wait是Object類的方法,用來(lái)線程間的通信,這個(gè)方法會(huì)使當(dāng)前擁有該對(duì)象鎖的進(jìn)程等待知道其他線程調(diào)用notify方法時(shí)再醒來(lái),不過(guò)你也可以給他指定一個(gè)時(shí)間,自動(dòng)醒來(lái)。這個(gè)方法主要是用走不同線程之間的調(diào)度的。

          區(qū)別二 :

          關(guān)于鎖的釋放 ,在這里假設(shè)大家已經(jīng)知道了鎖的概念及其意義。調(diào)用sleep方法不會(huì)釋放鎖(自己的感覺(jué)是sleep方法本來(lái)就是和鎖沒(méi)有關(guān)系的,因?yàn)樗且粋€(gè)線程用于管理自己的方法,不涉及線程通信)

          JDK 7 中的解釋:

          “public static void sleep(long millis)

          throws InterruptedException
          Causes the currently executing thread to sleep (temporarily cease execution) for the specified number of milliseconds, subject to the precision and accuracy of system timers and schedulers.The thread does not lose ownership of any monitors.

          public final void wait() throws InterruptedException
          Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0).The current thread must own this object's monitor. The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution.“
          調(diào)用wait方法會(huì)釋放當(dāng)前線程的鎖(其實(shí)線程間的通信是靠對(duì)象來(lái)管理的,所有操作一個(gè)對(duì)象的線程是這個(gè)對(duì)象通過(guò)自己的wait方法來(lái)管理的,就好像這個(gè)對(duì)象是電視機(jī),三個(gè)人是三個(gè)線程,那么電視機(jī)的遙控器就是這個(gè)鎖,假如現(xiàn)在A拿著遙控器,電視機(jī)調(diào)用wait方法,那么A就交出自己的遙控器,由jVM虛擬機(jī)調(diào)度,遙控器該交給誰(shuí)。)【我想到一個(gè)好玩的例子:如果A拿遙控器的期間,他可以用自己的sleep每隔十分鐘調(diào)一次電視臺(tái),而在他調(diào)臺(tái)休息的十分鐘期間,遙控器還在他的手上~】

          區(qū)別三:

          使用區(qū)域

          由于wait函數(shù)的特殊意義,所以他是應(yīng)該放在同步語(yǔ)句塊中的,這樣才有意義 。

          注意:兩個(gè)方法都需要拋出異常

          個(gè)人見(jiàn)解:有sleep和wait的第二個(gè)區(qū)別,引起了我對(duì)Java線程機(jī)制的一個(gè)疑問(wèn),目前還沒(méi)有看過(guò)JDk這方面的源碼(其實(shí)看了,是木有看懂),線程的同步管理,是不是由對(duì)象在調(diào)度,如果是對(duì)象在調(diào)度,那么JDK 1.5新引入的ReentrantLock機(jī)制就比synchronized關(guān)鍵字更值得提倡。因?yàn)樗芊从吵鲞@么一個(gè)機(jī)制來(lái)。好多人不能理解wait和sleep的區(qū)別,我認(rèn)為就是因?yàn)閟ynchronized關(guān)鍵字的影響。當(dāng)然自己還不懂JAVA的線程具體實(shí)現(xiàn),留作疑問(wèn)以后有時(shí)間繼續(xù)研究吧





          Java中的多線程是一種搶占式的機(jī)制 而不是分時(shí)機(jī)制。搶占式機(jī)制指的是有多個(gè)線程處于可運(yùn)行狀態(tài),但是只有一個(gè)線程在運(yùn)行。

          共同點(diǎn):
          1. 他們都是在多線程的環(huán)境下,都可以在程序的調(diào)用處阻塞指定的毫秒數(shù),并返回。

          2. wait()和sleep()都可以通過(guò)interrupt()方法打斷線程的暫停狀態(tài),從而使線程立刻拋出InterruptedException。
             如果線程A希望立即結(jié)束線程B,則可以對(duì)線程B對(duì)應(yīng)的Thread實(shí)例調(diào)用interrupt方法。如果此刻線程B正在wait/sleep /join,則線程B會(huì)立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結(jié)束線程。
             需要注意的是,InterruptedException是線程自己從內(nèi)部拋出的,并不是interrupt()方法拋出的。對(duì)某一線程調(diào)用 interrupt()時(shí),如果該線程正在執(zhí)行普通的代碼,那么該線程根本就不會(huì)拋出InterruptedException。但是,一旦該線程進(jìn)入到 wait()/sleep()/join()后,就會(huì)立刻拋出InterruptedException。

          不同點(diǎn):
          1. Thread類的方法:sleep(),yield()等
             Object的方法:wait()和notify()等
            
          2. 每個(gè)對(duì)象都有一個(gè)鎖來(lái)控制同步訪問(wèn)。Synchronized關(guān)鍵字可以和對(duì)象的鎖交互,來(lái)實(shí)現(xiàn)線程的同步。
             sleep方法沒(méi)有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

          3. wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
          4. sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常   

           

           

           線程的調(diào)度
                  線程調(diào)度器按線程的優(yōu)先級(jí)高低選擇高優(yōu)先級(jí)線程(進(jìn)入運(yùn)行中狀態(tài))執(zhí)行,同時(shí)線程調(diào)度是搶先式調(diào)度,即如果在當(dāng)前線程執(zhí)行過(guò)程中,一個(gè)更高優(yōu)先級(jí)的線程進(jìn)入可運(yùn)行狀態(tài),則這個(gè)線程立即被調(diào)度執(zhí)行。


          搶先式調(diào)度又分為:時(shí)間片方式和獨(dú)占方式。在時(shí)間片方式下,當(dāng)前活動(dòng)線程執(zhí)行完當(dāng)前時(shí)間片后,如果有其他處于就緒狀態(tài)的相同優(yōu)先級(jí)的線程,系統(tǒng)會(huì)將執(zhí)行權(quán)交給其他就緒態(tài)的同優(yōu)先級(jí)線程;當(dāng)前活動(dòng)線程轉(zhuǎn)入等待執(zhí)行隊(duì)列,等待下一個(gè)時(shí)間片的調(diào)度。
          在獨(dú)占方式下,當(dāng)前活動(dòng)線程一旦獲得執(zhí)行權(quán),將一直執(zhí)行下去,直到執(zhí)行完畢或由于某種原因主動(dòng)放棄CPU,或者是有一高優(yōu)先級(jí)的線程處于就緒狀態(tài)。

          posted on 2012-06-17 01:15 abin 閱讀(371) 評(píng)論(0)  編輯  收藏 所屬分類: JavaMultithread
          主站蜘蛛池模板: 河南省| 山东| 临湘市| 北宁市| 肃宁县| 丘北县| 克东县| 玛曲县| 怀来县| 巩义市| 三亚市| 长治县| 体育| 靖江市| 临湘市| 连州市| 民权县| 红安县| 惠安县| 阳曲县| 隆尧县| 黄平县| 新宁县| 达拉特旗| 高雄县| 简阳市| 凤台县| 彝良县| 德兴市| 西乌| 青岛市| 泾川县| 涟水县| 皮山县| 保德县| 大余县| 新蔡县| 东阿县| 康定县| 新化县| 昭平县|