乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Java 多線程 【轉(zhuǎn)載】

       劍氣簫心哈 2010-03-25

      Java多線程編程要點(diǎn)

      作者: chuangxin01

      1、 認(rèn)識(shí)Thread和Runnable

      Java中實(shí)現(xiàn)多線程有兩種途徑:繼承Thread類或者實(shí)現(xiàn)Runnable接口。Runnable是接口,建議用接口的方式生成線程,因?yàn)榻涌诳梢詫?shí)現(xiàn)多繼承,況且Runnable只有一個(gè)run方法,很適合繼承。在使用Thread的時(shí)候只需繼承Thread,并且new一個(gè)實(shí)例出來(lái),調(diào)用start()方法即可以啟動(dòng)一個(gè)線程。

      Thread Test = new Thread();

      Test.start();

      在使用Runnable的時(shí)候需要先new一個(gè)實(shí)現(xiàn)Runnable的實(shí)例,之后啟動(dòng)Thread即可。

      Test impelements Runnable;

      Test t = new Test();

      Thread test = new Thread(t);

      test.start();

      總結(jié):Thread和Runnable是實(shí)現(xiàn)java多線程的2種方式,runable是接口,thread是類,建議使用runable實(shí)現(xiàn)java多線程,不管如何,最終都需要通過(guò)thread.start()來(lái)使線程處于可運(yùn)行狀態(tài)。

      2、 認(rèn)識(shí)Thread的start和run

      1) start:

      用start方法來(lái)啟動(dòng)線程,真正實(shí)現(xiàn)了多線程運(yùn)行,這時(shí)無(wú)需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的代碼。通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程,這時(shí)此線程處于就緒(可運(yùn)行)狀態(tài),并沒(méi)有運(yùn)行,一旦得到spu時(shí)間片,就開(kāi)始執(zhí)行run()方法,這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容,Run方法運(yùn)行結(jié)束,此線程隨即終止。

      2) run:

      run()方法只是類的一個(gè)普通方法而已,如果直接調(diào)用Run方法,程序中依然只有主線程這一個(gè)線程,其程序執(zhí)行路徑還是只有一條,還是要順序執(zhí)行,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼,這樣就沒(méi)有達(dá)到寫(xiě)線程的目的。

      總結(jié):調(diào)用start方法方可啟動(dòng)線程,而run方法只是thread的一個(gè)普通方法調(diào)用,還是在主線程里執(zhí)行。

      3、 線程狀態(tài)說(shuō)明

      線程狀態(tài)從大的方面來(lái)說(shuō),可歸結(jié)為:初始狀態(tài)、可運(yùn)行狀態(tài)、不可運(yùn)行狀態(tài)和消亡狀態(tài),具體可細(xì)分為上圖所示7個(gè)狀態(tài),說(shuō)明如下:

      1) 線程的實(shí)現(xiàn)有兩種方式,一是繼承Thread類,二是實(shí)現(xiàn)Runnable接口,但不管怎樣,當(dāng)我們new了thread實(shí)例后,線程就進(jìn)入了初始狀態(tài);

      2) 當(dāng)該對(duì)象調(diào)用了start()方法,就進(jìn)入可運(yùn)行狀態(tài);

      3) 進(jìn)入可運(yùn)行狀態(tài)后,當(dāng)該對(duì)象被操作系統(tǒng)選中,獲得CPU時(shí)間片就會(huì)進(jìn)入運(yùn)行狀態(tài);

      4) 進(jìn)入運(yùn)行狀態(tài)后case就比較多,大致有如下情形:

      ﹒run()方法或main()方法結(jié)束后,線程就進(jìn)入終止?fàn)顟B(tài);

      ﹒當(dāng)線程調(diào)用了自身的sleep()方法或其他線程的join()方法,就會(huì)進(jìn)入阻塞狀態(tài)(該狀態(tài)既停止當(dāng)前線程,但并不釋放所占有的資源)。當(dāng)sleep()結(jié)束或join()結(jié)束后,該線程進(jìn)入可運(yùn)行狀態(tài),繼續(xù)等待OS分配時(shí)間片;

      ﹒當(dāng)線程剛進(jìn)入可運(yùn)行狀態(tài)(注意,還沒(méi)運(yùn)行),發(fā)現(xiàn)將要調(diào)用的資源被鎖牢(synchroniza,lock),將會(huì)立即進(jìn)入鎖池狀態(tài),等待獲取鎖標(biāo)記(這時(shí)的鎖池里也許已經(jīng)有了其他線程在等待獲取鎖標(biāo)記,這時(shí)它們處于隊(duì)列狀態(tài),既先到先得),一旦線程獲得鎖標(biāo)記后,就轉(zhuǎn)入可運(yùn)行狀態(tài),等待OS分配CPU時(shí)間片;

      ﹒當(dāng)線程調(diào)用wait()方法后會(huì)進(jìn)入等待隊(duì)列(進(jìn)入這個(gè)狀態(tài)會(huì)釋放所占有的所有資源,與阻塞狀態(tài)不同),進(jìn)入這個(gè)狀態(tài)后,是不能自動(dòng)喚醒的,必須依靠其他線程調(diào)用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個(gè)線程,但我們由不能確定具體喚醒的是哪一個(gè)線程,也許我們需要喚醒的線程不能夠被喚醒,因此在實(shí)際使用時(shí),一般都用notifyAll()方法,喚醒有所線程),線程被喚醒后會(huì)進(jìn)入鎖池,等待獲取鎖標(biāo)記。

      ﹒當(dāng)線程調(diào)用stop方法,即可使線程進(jìn)入消亡狀態(tài),但是由于stop方法是不安全的,不鼓勵(lì)使用,大家可以通過(guò)run方法里的條件變通實(shí)現(xiàn)線程的stop。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多