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

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

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

    posts - 12, comments - 8, trackbacks - 0, articles - 5
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    java線程的幾個概念和方法

    Posted on 2010-11-17 15:08 楊羅羅 閱讀(14102) 評論(1)  編輯  收藏 所屬分類: java.thread



    在Java中創(chuàng)建線程有兩種方法:使用Thread類和使用Runnable接口。
    要注意的是Thread類也實現(xiàn)了Runnable接口,因此,從Thread類繼承的類的實例也可以作為target傳入這個構造方法。可通過這種方法實現(xiàn)多個線程的資源共享。

    線程的生命周期:
    新建狀態(tài):用new語句創(chuàng)建的線程對象處于新建狀態(tài),此時它和其它的java對象一樣,僅僅在堆中被分配了內(nèi)存
    就緒狀態(tài):當一個線程創(chuàng)建了以后,其他的線程調(diào)用了它的start()方法,該線程就進入了就緒狀態(tài)。處于這個狀態(tài)的線程位于可運行池中,等待獲得CPU的使用權
    運行狀態(tài):處于這個狀態(tài)的線程占用CPU,執(zhí)行程序的代碼
    阻塞狀態(tài):當線程處于阻塞狀態(tài)時,java虛擬機不會給線程分配CPU,直到線程重新進入就緒狀態(tài),它才有機會轉(zhuǎn)到運行狀態(tài)。
    阻塞狀態(tài)分為三種情況:
    1、 位于對象等待池中的阻塞狀態(tài):當線程運行時,如果執(zhí)行了某個對象的wait()方法,java虛擬機就回把線程放到這個對象的等待池中
    2、 位于對象鎖中的阻塞狀態(tài),當線程處于運行狀態(tài)時,試圖獲得某個對象的同步鎖時,如果該對象的同步鎖已經(jīng)被其他的線程占用,JVM就會把這個線程放到這個對象的瑣池中。
    3、 其它的阻塞狀態(tài):當前線程執(zhí)行了sleep()方法,或者調(diào)用了其它線程的join()方法,或者發(fā)出了I/O請求時,就會進入這個狀態(tài)中。

    一、創(chuàng)建并運行線程
        當調(diào)用start方法后,線程開始執(zhí)行run方法中的代碼。線程進入運行狀態(tài)。可以通過Thread類的isAlive方法來判斷線程是否處于運行狀態(tài)。當線程處于運行狀態(tài)時,isAlive返回true,當isAlive返回false時,可能線程處于等待狀態(tài),也可能處于停止狀態(tài)。

    二、掛起和喚醒線程
    一但線程開始執(zhí)行run方法,就會一直到這個run方法執(zhí)行完成這個線程才退出。但在線程執(zhí)行的過程中,可以通過兩個方法使線程暫時停止執(zhí)行。這兩個方法是suspend和sleep。在使用suspend掛起線程后,可以通過resume方法喚醒線程。而使用sleep使線程休眠后,只能在設定的時間后使線程處于就緒狀態(tài)(在線程休眠結(jié)束后,線程不一定會馬上執(zhí)行,只是進入了就緒狀態(tài),等待著系統(tǒng)進行調(diào)度)。
    雖然suspend和resume可以很方便地使線程掛起和喚醒,但由于使用這兩個方法可能會造成一些不可預料的事情發(fā)生,因此,這兩個方法被標識為deprecated(抗議)標記,這表明在以后的jdk版本中這兩個方法可能被刪除,所以盡量不要使用這兩個方法來操作線程。下面的代碼演示了sleep、suspend和resume三個方法的使用。

    三、終止線程的三種方法
    有三種方法可以使終止線程。
    1.  使用退出標志,使線程正常退出,也就是當run方法完成后線程終止。
    2.  使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發(fā)生不可預料的結(jié)果)。
    3.  使用interrupt方法中斷線程。

    線程的幾個方法:
    join():等待此線程死亡后再繼續(xù),可使異步線程變?yōu)橥骄€程
    interrupt():中斷線程,被中斷線程會拋InterruptedException

    線程通信:wait(),notify()   - 典型應用:放取雞蛋
    wait() 等待獲取鎖:

    表示等待獲取某個鎖

    執(zhí)行了該方法的線程釋放對象的鎖,JVM會把該線程放到對象的等待池中。該線程等待其它線程喚醒
    notify() 執(zhí)行該方法的線程喚醒在對象的等待池中等待的一個線程,JVM從對象的等待池中隨機選擇一個線程,把它轉(zhuǎn)到對象的鎖池中。使線程由阻塞隊列進入就緒狀態(tài)

    sleep():讓當前正在執(zhí)行的線程休眠,有一個用法可以代替yield函數(shù)——sleep(0)
    yield():暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。也就是交出CPU一段時間

    sleep和yield區(qū)別:
    1、sleep()方法會給其他線程運行的機會,而不考慮其他線程的優(yōu)先級,因此會給較低線程一個運行的機會;yield()方法只會給相同優(yōu)先級或者更高優(yōu)先級的線程一個運行的機會。
    2、當線程執(zhí)行了sleep(long millis)方法后,將轉(zhuǎn)到阻塞狀態(tài),參數(shù)millis指定睡眠時間;當線程執(zhí)行了yield()方法后,將轉(zhuǎn)到就緒狀態(tài)
    3、sleep()方法聲明拋出InterruptedException異常,而yield()方法沒有聲明拋出任何異常
    4、sleep()方法比yield()方法具有更好的移植性

    如果希望明確地讓一個線程給另外一個線程運行的機會,可以采取以下的辦法之一:
    1、 調(diào)整各個線程的優(yōu)先級
    2、 讓處于運行狀態(tài)的線程調(diào)用Thread.sleep()方法
    3、 讓處于運行狀態(tài)的線程調(diào)用Thread.yield()方法
    4、 讓處于運行狀態(tài)的線程調(diào)用另一個線程的join()方法

    首先,wait()和notify(),notifyAll()是Object類的方法,sleep()和yield()是Thread類的方法

    (1).常用的wait方法有wait()wait(long timeout):
        void wait() 在其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法前,導致當前線程等待。
        void wait(long timeout) 在其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法,或者超過指定的時間量前,導致當前線程等待。
        wait()后,線程會釋放掉它所占有的“鎖標志”,從而使線程所在對象中的其它synchronized數(shù)據(jù)可被別的線程使用。
        wait()和notify()因為會對對象的“鎖標志”進行操作,所以它們必須在synchronized函數(shù)或synchronized  block中進行調(diào)用。如果在non-synchronized函數(shù)或non-synchronized block中進行調(diào)用,雖然能編譯通過,但在運 行時會發(fā)生IllegalMonitorStateException的異常。

    (2).Thread.sleep(long millis),必須帶有一個時間參數(shù)
        sleep(long)使當前線程進入停滯狀態(tài),所以執(zhí)行sleep()的線程在指定的時間內(nèi)肯定不會被執(zhí)行;
        sleep(long)可使優(yōu)先級低的線程得到執(zhí)行的機會,當然也可以讓同優(yōu)先級和高優(yōu)先級的線程有執(zhí)行的機會;
        sleep(long)是不會釋放鎖標志的。

    (3).yield()沒有參數(shù)。
        sleep 方法使當前運行中的線程睡眼一段時間,進入不可運行狀態(tài),這段時間的長短是由程序設定的,yield 方法使當前線程讓出CPU占有權,但讓出的時間是不可設定的
        yield()也不會釋放鎖標志。

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

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

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

    volitile 語義:
    volatile相當于synchronized的弱實現(xiàn),也就是說volatile實現(xiàn)了類似synchronized的語義,卻又沒有鎖機制。它確保對volatile字段的更新以可預見的方式告知其他的線程。
    volatile包含以下語義:
    (1)Java 存儲模型不會對valatile指令的操作進行重排序:這個保證對volatile變量的操作時按照指令的出現(xiàn)順序執(zhí)行的。
    (2)volatile變量不會被緩存在寄存器中(只有擁有線程可見)或者其他對CPU不可見的地方,每次總是從主存中讀取volatile變量的結(jié)果。也就是說對于volatile變量的修改,其它線程總是可見的,并且不是使用自己線程棧內(nèi)部的變量。也就是在happens-before法則中,對一個valatile變量的寫操作后,其后的任何讀操作理解可見此寫操作的結(jié)果。
    盡管volatile變量的特性不錯,但是volatile并不能保證線程安全的,也就是說volatile字段的操作不是原子性的,volatile變量只能保證可見性(一個線程修改后其它線程能夠理解看到此變化后的結(jié)果),要想保證原子性,目前為止只能加鎖!

    數(shù)據(jù)同步:

    線程同步的特征:
    1、 如果一個同步代碼塊和非同步代碼塊同時操作共享資源,仍然會造成對共享資源的競爭。因為當一個線程執(zhí)行一個對象的同步代碼塊時,其他的線程仍然可以執(zhí)行對象的非同步代碼塊。(所謂的線程之間保持同步,是指不同的線程在執(zhí)行同一個對象的同步代碼塊時,因為要獲得對象的同步鎖而互相牽制)
    2、 每個對象都有唯一的同步鎖
    3、 在靜態(tài)方法前面可以使用synchronized修飾符。
    4、 當一個線程開始執(zhí)行同步代碼塊時,并不意味著必須以不間斷的方式運行,進入同步代碼塊的線程可以執(zhí)行Thread.sleep()或者執(zhí)行Thread.yield()方法,此時它并不釋放對象鎖,只是把運行的機會讓給其他的線程。
    5、 Synchronized聲明不會被繼承,如果一個用synchronized修飾的方法被子類覆蓋,那么子類中這個方法不在保持同步,除非用synchronized修飾。

    評論

    # re: java線程的幾個概念和方法  回復  更多評論   

    2010-11-25 17:26 by 馮魁
    很好 很詳細 學習了

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 最新精品亚洲成a人在线观看| 日本v片免费一区二区三区| 国产av无码专区亚洲国产精品| 亚洲av色香蕉一区二区三区| 最近中文字幕无吗免费高清| 亚洲成a人片在线观看播放| 日本一卡精品视频免费| 亚洲综合久久综合激情久久 | 亚洲一线产品二线产品| 黄色永久免费网站| 亚洲AV无码一区二区三区人| 在线看片韩国免费人成视频| 亚洲国产日韩在线人成下载| 91嫩草国产在线观看免费| 一本色道久久88—综合亚洲精品| 天天天欲色欲色WWW免费| 自拍偷自拍亚洲精品播放| 亚洲国产精品无码久久九九| 男女一进一出抽搐免费视频| 九月丁香婷婷亚洲综合色| 99久久99久久免费精品小说| 亚洲人成毛片线播放| 女人被弄到高潮的免费视频| 看亚洲a级一级毛片| 亚洲人成色7777在线观看不卡| 国产免费一区二区三区不卡| 亚洲成av人片不卡无码| 久久精品女人天堂AV免费观看| 粉色视频成年免费人15次| 亚洲综合伊人久久综合| 亚洲电影免费观看| 小说区亚洲自拍另类| 国产亚洲精品精品国产亚洲综合| 99热这里只有精品6免费| 亚洲男同gay片| 国产亚洲成av片在线观看| 黄页网站免费观看| 一边摸一边桶一边脱免费视频 | 激情综合色五月丁香六月亚洲| 麻豆成人久久精品二区三区免费| 亚洲精品免费网站|