<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

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

    區別一:

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

    wait是Object類的方法,用來線程間的通信,這個方法會使當前擁有該對象鎖的進程等待知道其他線程調用notify方法時再醒來,不過你也可以給他指定一個時間,自動醒來。這個方法主要是用走不同線程之間的調度的。

    區別二 :

    關于鎖的釋放 ,在這里假設大家已經知道了鎖的概念及其意義。調用sleep方法不會釋放鎖(自己的感覺是sleep方法本來就是和鎖沒有關系的,因為他是一個線程用于管理自己的方法,不涉及線程通信)

    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.“
    調用wait方法會釋放當前線程的鎖(其實線程間的通信是靠對象來管理的,所有操作一個對象的線程是這個對象通過自己的wait方法來管理的,就好像這個對象是電視機,三個人是三個線程,那么電視機的遙控器就是這個鎖,假如現在A拿著遙控器,電視機調用wait方法,那么A就交出自己的遙控器,由jVM虛擬機調度,遙控器該交給誰。)【我想到一個好玩的例子:如果A拿遙控器的期間,他可以用自己的sleep每隔十分鐘調一次電視臺,而在他調臺休息的十分鐘期間,遙控器還在他的手上~】

    區別三:

    使用區域

    由于wait函數的特殊意義,所以他是應該放在同步語句塊中的,這樣才有意義 。

    注意:兩個方法都需要拋出異常

    個人見解:有sleep和wait的第二個區別,引起了我對Java線程機制的一個疑問,目前還沒有看過JDk這方面的源碼(其實看了,是木有看懂),線程的同步管理,是不是由對象在調度,如果是對象在調度,那么JDK 1.5新引入的ReentrantLock機制就比synchronized關鍵字更值得提倡。因為他更能反映出這么一個機制來。好多人不能理解wait和sleep的區別,我認為就是因為synchronized關鍵字的影響。當然自己還不懂JAVA的線程具體實現,留作疑問以后有時間繼續研究吧





    Java中的多線程是一種搶占式的機制 而不是分時機制。搶占式機制指的是有多個線程處于可運行狀態,但是只有一個線程在運行。

    共同點:
    1. 他們都是在多線程的環境下,都可以在程序的調用處阻塞指定的毫秒數,并返回。

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

    不同點:
    1. Thread類的方法:sleep(),yield()等
       Object的方法:wait()和notify()等
      
    2. 每個對象都有一個鎖來控制同步訪問。Synchronized關鍵字可以和對象的鎖交互,來實現線程的同步。
       sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法。

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

     

     

     線程的調度
            線程調度器按線程的優先級高低選擇高優先級線程(進入運行中狀態)執行,同時線程調度是搶先式調度,即如果在當前線程執行過程中,一個更高優先級的線程進入可運行狀態,則這個線程立即被調度執行。


    搶先式調度又分為:時間片方式和獨占方式。在時間片方式下,當前活動線程執行完當前時間片后,如果有其他處于就緒狀態的相同優先級的線程,系統會將執行權交給其他就緒態的同優先級線程;當前活動線程轉入等待執行隊列,等待下一個時間片的調度。
    在獨占方式下,當前活動線程一旦獲得執行權,將一直執行下去,直到執行完畢或由于某種原因主動放棄CPU,或者是有一高優先級的線程處于就緒狀態。

    posted on 2012-06-17 01:15 abin 閱讀(370) 評論(0)  編輯  收藏 所屬分類: JavaMultithread
    主站蜘蛛池模板: 美女裸免费观看网站| 一个人免费观看在线视频www| 亚洲毛片免费观看| 免费的一级黄色片| 久久国产免费直播| 亚洲精品综合在线影院| 亚洲片国产一区一级在线观看| 久草免费福利资源站| 亚洲爆乳精品无码一区二区| 亚洲AV无码日韩AV无码导航| 免费看AV毛片一区二区三区| 中文字幕无码一区二区免费| 亚洲AV成人无码网天堂| 亚洲电影中文字幕| 亚洲?V乱码久久精品蜜桃| 91久久成人免费| 两个人看的www高清免费视频| 亚洲日韩精品无码专区加勒比 | 久久精品国产精品亚洲人人| 91麻豆最新在线人成免费观看| 一级视频在线免费观看| 2017亚洲男人天堂一| 亚洲熟妇无码AV在线播放| 午夜免费福利网站| 亚洲视频免费一区| 波多野结衣免费一区视频 | 免费国产污网站在线观看不要卡| 亚洲黄色在线观看| 亚洲香蕉网久久综合影视| 永久黄网站色视频免费直播 | 亚洲AV无码久久精品狠狠爱浪潮| 四虎在线播放免费永久视频| 国产成人精品久久免费动漫| 国内精品久久久久影院免费 | 亚洲综合色丁香婷婷六月图片| 亚洲一区二区电影| 国产亚洲福利精品一区| 亚洲精品高清在线| 免费人成在线观看网站品爱网日本| 97性无码区免费| 在线观看免费视频资源|