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

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

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

    posts - 6, comments - 21, trackbacks - 0, articles - 2

    JAVA學(xué)習(xí)筆記——多線程(并發(fā))

    Posted on 2005-02-01 23:41 tedazf 閱讀(8675) 評(píng)論(4)  編輯  收藏 所屬分類: JAVA

    JAVA學(xué)習(xí)筆記——多線程(并發(fā))

     

    多線程的用途

    程序的某一部分正在等一個(gè)事件或資源,而你又不想讓它把整個(gè)程序都給阻塞了。因此你可以創(chuàng)建一個(gè)與該事件或資源相關(guān)的線程,讓它與主程序分開來運(yùn)行,例如在運(yùn)算的同時(shí),監(jiān)視鍵盤的輸入。

     

    多線程的缺點(diǎn)

    共享資源時(shí),會(huì)降低運(yùn)行效率;額外的消耗CPU資源;使用不當(dāng)會(huì)拋出異常、或引發(fā)一些不正常狀態(tài);與平臺(tái)有一定的相關(guān)性。

     

    線程的狀態(tài)

    1.       new:線程剛剛建好,還未啟動(dòng)。

    2.       runable:排在隊(duì)列中等待被分配CPU時(shí)間片。

    3.       dead:被中止的狀態(tài)。

    4.       blocked:由于非CPU時(shí)間片原因而不能運(yùn)行的線程(如sleep()、wait()、IO問題)

     

    實(shí)現(xiàn)方法

    1.       創(chuàng)造一個(gè)類去實(shí)現(xiàn)runable接口,并重寫run()方法,然后實(shí)例化出來一個(gè)對(duì)象A,然后在主程序中用A作為參數(shù)創(chuàng)建一個(gè)Thread類的對(duì)象,調(diào)用其中的start()來啟動(dòng)線程。(翁愷與孫鑫推薦用此種方法創(chuàng)建線程)

    2.       Thread類中派生出一個(gè)類,重寫run()方法,然后在主線程中創(chuàng)建一個(gè)對(duì)象,調(diào)用其中的start()方法來啟動(dòng)線程。(BruceEckel則推薦用此種方法創(chuàng)建線程)

     

    主要函數(shù)

    start():啟動(dòng)一個(gè)進(jìn)程。

    stop():結(jié)束一個(gè)進(jìn)程,由于它不會(huì)釋放對(duì)象的鎖,所以現(xiàn)在已經(jīng)不提倡使用它了。

    suspend():掛起進(jìn)程。(不推薦使用)

    resume():喚醒進(jìn)程。(不推薦使用)

    interrupt():打斷

    yield():主動(dòng)放棄CPU的占用,也可能在未執(zhí)行到此語(yǔ)句時(shí),被虛擬機(jī)強(qiáng)制放棄,所以一般不能用來嚴(yán)格控制線程。

    sleep():暫停線程一段時(shí)間,然后重新進(jìn)入CPU使用序列排隊(duì),所以并不能準(zhǔn)確地設(shè)定線程的暫停時(shí)間,所設(shè)定的時(shí)間只是最少的使用時(shí)間(異常情況不算)。另外,一定要放在try域中。

    setPriority():設(shè)置線程的優(yōu)先級(jí)。

    getPriority():獲取線程的優(yōu)先級(jí)。由不同操作系統(tǒng)的優(yōu)先級(jí)設(shè)定不太一樣,所以對(duì)優(yōu)先級(jí)的操作最好使用MIN_PRIORITY, NORM_PRIORITY, MIN_PRORITY來表示。

    setDaemon():用于將線程設(shè)置為Daemon線程,但必須在線程啟動(dòng)之前。

    isDaemon():判斷線程是否為Daemon線程。

    isAlive():判斷線程是否還存在。

    join():用于不同線程間的聯(lián)系,當(dāng)一個(gè)線程1調(diào)用另一個(gè)線程2join()方法,那么線程1在線程2結(jié)束前就會(huì)被掛起(除非設(shè)置timeout)。由于也可以被interrupt()打斷,所以也要放在try域中。

    currentThread():獲得當(dāng)前線程,即執(zhí)行此方法的線程。

    getName():獲得線程的名字。

    getThreadGroup():獲得線程所屬的線程組。

     

    Daemon線程

    Daemon線程在后臺(tái)運(yùn)行,當(dāng)所有的非Daemon線程結(jié)束了,Daemon線程也隨之結(jié)束,另外在Daemon線程中創(chuàng)建的線程,都默認(rèn)設(shè)置為Daemon線程。

     

     

    解決共享資源沖突

    防止資源沖突的兩種方法:同步塊和同步方法。

    同步塊:需要將要同步的代碼放到synchronizedobject{}中,由于每個(gè)對(duì)象均有一個(gè)監(jiān)視器(鎖),所以其中的object可為任意類的對(duì)象,靜態(tài)方法則默認(rèn)使用類的Class對(duì)象。

    同步方法:將需要同步的代碼放到某一方法中,且將方法設(shè)置為synchronized

     

    進(jìn)程間的協(xié)作

    當(dāng)發(fā)生nodify()的時(shí)候,發(fā)生wait()的地方才可以繼續(xù)運(yùn)行,且它們必須放在同一個(gè)對(duì)象的同步塊或同步方法之中。

    wait()后將當(dāng)前線程放到一個(gè)等待隊(duì)列中,nodify()后從等待隊(duì)列中隨意激活一個(gè)。

     

    線程組

    線程組是一個(gè)裝線程的容器。用Joshua Bloch,也就是負(fù)責(zé)修補(bǔ)和改進(jìn)JDK 1.2Java容器類庫(kù)的那位Sun的軟件架構(gòu)師,的話來講,它的意義可以概括為:“最好把線程組看成是一次不成功的實(shí)驗(yàn),或者就當(dāng)它根本不存在。”

     

    Java運(yùn)行時(shí)的幾個(gè)系統(tǒng)線程

    Referrence Handler:系統(tǒng)用來控制引用的線程。(優(yōu)先級(jí):10

    Finalizer:垃圾收集器。(優(yōu)先級(jí):8

    Singnal Dispatcher:信號(hào)分配器。(優(yōu)先級(jí):10

    Compiler Thread:用于優(yōu)化。(優(yōu)先級(jí):10

     

     

    其他一些小問題

         JAVA中只有除longdouble以外的基本類型的賦值和返回式原子操作,其他的操作即使看上去非常像原子操作,我們也最好加上synchronized,這也算是JAVAC++的一點(diǎn)不同之處吧。最安全的原子操作只有讀取和對(duì)primitive賦值這兩種。

         如果你要防止訪問資源沖突,就索性把類中的所有的方法全都synchronize了,因?yàn)榕袛嗄男┓椒ㄔ?/SPAN>synchronize很難的,而且synchronize對(duì)性能的影響也不大。

         對(duì)象使用完之后,要記得賦值為null,也就是釋放其內(nèi)存空間。

         Thread類的對(duì)象不會(huì)因?yàn)闆]有引用而被垃圾收集起收集掉,直到其線程結(jié)束。

         volatile標(biāo)記用來排除優(yōu)化,否則,編譯器僅會(huì)讀取緩存中的變量。

     

     

    參考:《Think In JAVA第三版》、翁愷java教學(xué)視頻、孫鑫java教學(xué)視頻。

     

    Feedback

    # re: JAVA學(xué)習(xí)筆記——多線程(并發(fā))  回復(fù)  更多評(píng)論   

    2005-02-03 09:16 by JAVAV
    好,加油,繼續(xù)努力!

    # re: JAVA學(xué)習(xí)筆記——多線程(并發(fā))  回復(fù)  更多評(píng)論   

    2005-09-22 13:35 by todi
    good

    # re: JAVA學(xué)習(xí)筆記——多線程(并發(fā))  回復(fù)  更多評(píng)論   

    2007-08-17 13:55 by 天天看海
    喜歡研究JAVA多線程的朋友可以加入QQ群34237757

    # re: JAVA學(xué)習(xí)筆記——多線程(并發(fā))  回復(fù)  更多評(píng)論   

    2009-09-07 09:11 by lc402431247
    學(xué)習(xí)了。

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲综合av一区二区三区不卡 | 啊v在线免费观看| 亚洲国产精品网站久久| 久久综合给合久久国产免费| 亚洲精品~无码抽插| 久久av免费天堂小草播放| 免费大黄网站在线看| 豆国产96在线|亚洲| 国产99视频免费精品是看6| 国产精品亚洲精品日韩电影| 国产精品免费看久久久久| 美女视频黄频a免费大全视频| 好爽好紧好大的免费视频国产 | 无码国产精品久久一区免费 | 亚洲电影免费观看| 亚洲天堂一区在线| 无码国产精品久久一区免费| 国产精品亚洲av色欲三区| 亚洲av无码国产精品色在线看不卡 | 五月天婷婷精品免费视频| 国产精品亚洲mnbav网站| a毛片全部免费播放| 久久精品蜜芽亚洲国产AV| 曰批视频免费30分钟成人| 亚洲AV无码一区二区三区性色| 四只虎免费永久观看| 好吊色永久免费视频大全| 亚洲情a成黄在线观看动漫尤物| 18禁免费无码无遮挡不卡网站| 国产亚洲精品成人AA片| 四虎亚洲国产成人久久精品| 丝袜捆绑调教视频免费区| 91嫩草私人成人亚洲影院| 成人免费视频88| 国产精品福利片免费看| 色婷婷六月亚洲婷婷丁香| 免费看香港一级毛片| 波霸在线精品视频免费观看| 亚洲明星合成图综合区在线| 免费大香伊蕉在人线国产| a毛片在线免费观看|