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

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

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

    Java, Only Java!

    統計

    留言簿(20)

    積分與排名

    好友空間

    文檔技巧

    閱讀排行榜

    評論排行榜

    《Java大學教程》—第22章 多線程程序

    22.2 進程(process):P551
    時間切片(time-slicing):處理器只是完成了一個任務的一部分工作,然后完成下一個任務的一部分工作,
    因為處理呂每次完成工作的時間都非常短,因此看起來這些任務是同時完成的。

    進程:一個運行的程序通常稱為一個進程。
    并發進程(concurrent process):兩個或多個可以同時執行的進程稱為并發進程。
    在多個進程并發執行時,每個進程都有自己的存放程序代碼和數據的存儲空間,并且每個進程的存儲空間對于其他進程都是受保護的,所有這些工作都由操作系統完成。

    22.3    線程(thread):P552
    線程:一個程序執行的多個獨立任務稱為線程。通常將線程稱為輕量級進程(lightweight process),因為也管理進程相比,管理線程需要占用較少的系統資源。
    線程沒有完全獨立的存儲空間,線程之間共享代碼區和存儲區。
    管理線程的方式也是基于時間切片原則,由JVM和OS協同管理。

    22.4    Thread類
    繼承Thread類實現線程??刂凭€程用三個方法:start(), run(), finish()
    主要執行代碼在run()方法中。
    注:run()方法結束后,這個線程就運行結束了,不可以再次調用,必須重新創建。原因也可參考圖22-2的狀態轉換圖,線程進入TERMINATE狀態中,無法再次啟動。

    22.5    線程的執行與調度
    份額(quantum):每個進程或者線程都可以獲得處理器上的一小段時間--稱為份額,然后輪轉到下一個進程或線程。
    份額內時間沒有用完時,也可以使用sleep()方法,強制放棄CPU的占用權,將CPU還給OS,從而可以繼續分配給下一個進程或線程。
    注:sleep()方法傳入的時間間隔(以毫秒為單位),可能會拋出InterruptedException異常,必須寫在try...catch代碼塊中。

    22.6    Runnable接口
    創建一個實現Runnable接口的類,然后將類的實例作為Runnable接口的參數傳入Thread對象的構造函數中。
    后面的工作主要就是操作Thread的對象,與前面擴展Thread類的方法一樣了。
    注:此處的Thread對象是獨立創建的,前面是對Thread類的繼承。

    22.7    線程同步:P562
    異步行為(asynchronous behaviour):
        在一般情況下兩個或多個并發執行線程的行為并不是協同的,而且無法預知在某個時間段內哪個線程將會占用CPU,這種非協同的行為稱為異步行為。
    互斥訪問(mutual exclusion):需要將訪問緩沖區的程序段看作臨界區(critical section)--即在任何時刻只能被一個進程訪問的區域,實現臨界區的方式稱為互斥訪問。
    忙等待(busy waiting):被某個線程執行的方法循環中反復執行,直到滿足某個條件才能終止。效率太低,可以使用wait()方法將線程掛起,直到被其他線程的消息喚醒。
    在Java中創建一個monitor對象(監視器),monitor類的所有方法在任何時刻都只能被一個線程訪問。
    可以在方法的頭部使用synchronized修飾符,由于方法被同步(synchronized),所以一旦有某個對象調用該方法,那么該方法將被置上一個鎖(lock),
    其他對象必須在該方法執行完成后才能訪問它。
    注1:為什么要加鎖?是因為你有臨界區,對這個臨界區加鎖才是目的。
    因此鎖的目的:當前類(即this.靜態變量),當前對象(即this.變量),當前對象中創建的對象(即this.對象變量),外部傳入到當前對象中的對象。

    注2:什么可以加鎖?對象,只有對象可以加鎖。
    在Java中,每一個對象都擁有一個鎖標記(monitor),也稱為監視器,多線程同時訪問某個對象時,線程只有獲取了該對象的鎖才能訪問。
    JVM會記錄并且監管這個鎖,當線程獲取鎖后計數器由0變1,線程若訪問同樣鎖的其他方法,計數器還會繼續增加,從而保證線程完全釋放這個鎖后才會允許其他線程訪問。
    所以基本數據類型的變量是不能作為臨界區的,也就不能被加鎖。

    注3:怎么樣加鎖?使用synchronized對靜態方法、方法、對象變量加鎖。
    static synchronized aStaticMethod(){...}        //        “當前類(即this.靜態變量)”加鎖
    synchronized aMethod(){...}        //        “當前對象(即this.變量)”加鎖
    synchronized (aObjectVariable){...}        //        “當前對象中創建的對象(即this.對象變量)”或“外部傳入到當前對象中的對象”加鎖。

    22.8    線程狀態:P563
    狀態轉換圖:圖22-2 一個線程的狀態轉換圖
    start()啟動一個線程-->線程進入ready(就緒)狀態。
    dispatch()調度一個線程-->線程進入running(運行)狀態。
    線程運行時間超時、yield()強制一個線程放棄CPU-->線程進入ready(就緒)狀態。
    sleep()睡眠一個線程-->線程進入sleeping(睡眠)狀態-->睡眠時間超時-->線程進入ready(就緒)狀態。
    wait()-->線程進入waiting(等待)狀態-->獲得其他線程notify()或notifyAll()方法通知-->線程進入ready(就緒)狀態。
    由于等待輸入或等待外部設備可用-->線程處于blocked(阻塞)狀態-->阻塞時間超時或設備正常-->線程進入ready(就緒)狀態。
    run()方法完成后,線程被終止。

    22.10    Timer類:調度線程
    在固定時間間隔內生成ActionEvents對象。因此,必須將一個Timer對象關聯到一個ActionListener對象。
    只要Timer對象生成一個ActionEvent對象,都會執行與Timer對象相關的ActionListener對象的actionPerformed()方法。

    自測題:
    1.    如何通過時間切片實現并發:P552
    時間切片(time-slicing):處理器只是完成了一個任務的一部分工作,然后完成下一個任務的一部分工作,
    因為處理呂每次完成工作的時間都非常短,因此看起來這些任務是并發完成的。

    2.    進程與線程的區別:P552
    每個進程都有完全獨立的存儲空間,用于存放程序的代碼和數據,并且每個進程的存儲空間對于其他進程都是受保護的,所有這些工作都由操作系統完成。
    每個線程沒有完全獨立的存儲空間,線程之間共享程序的代碼和數據,線程的調度由JVM和操作系統協同完成。

    3.    異步線程執行和同步線程執行的區別:P562
    異步執行線程:無法預知某個時間段內哪個線程將會占用CPU,也無法估計程序執行的結果。
    同步執行線程:確保線程對于臨界區是互斥訪問的,當某個線程執行同步代碼時,其他線程無法再調用同步代碼,必須等待前面執行的進程解鎖。

    4.    臨界區和互斥的概念:P562
    訪問緩沖區的程序段看作臨界區(critical section)--即在任何時刻只能被一個進程訪問的區域。
    實現臨界區的方式稱為互斥訪問(mutual exclusion)。
    Jav提供了在多線程程序中實現互斥的機制,即每個對象都有一個monitor(監視器),monitor類的所有方法在任何時刻都只能被一個線程訪問。
    只需要在方法的頭部使用synchronized修飾符,由于方法被同步,所以一旦有某個對象調用該方法,那么這個方法就會被上鎖,其他對象如果同時想訪問就必須等待。

    5.    如何在Java程序中避免忙等待:P562
    使用wait()方法將線程的執行掛起,直到它收到另一個進程的消息將它喚醒。就可以避免出現忙等待。

    6.    Threads6.java    RunThreads6.java

    編程練習:代碼附件
    3.    CounterVersionFour.java    RunCounterVersion.java    CounterThread.java

    posted on 2016-10-04 16:36 zYx.Tom 閱讀(289) 評論(0)  編輯  收藏 所屬分類: 1.Java世界

    主站蜘蛛池模板: 狼友av永久网站免费观看| 1000部拍拍拍18勿入免费凤凰福利 | 精品国产日韩亚洲一区在线| 黄页网站免费在线观看| 亚洲精品中文字幕无码AV| 无码人妻一区二区三区免费看| 亚洲国产精品一区二区成人片国内| 黄床大片免费30分钟国产精品| 亚洲片一区二区三区| 久久久受www免费人成| 亚洲乳大丰满中文字幕| 在线观看免费播放av片| 91亚洲国产在人线播放午夜| 精品无码免费专区毛片| 亚洲精品中文字幕无乱码麻豆| 在线免费观看一级毛片| 免费人成网站永久| 自拍偷自拍亚洲精品第1页 | 一级毛片在线免费播放| 亚洲精品中文字幕无码蜜桃| 久久这里只精品热免费99| 亚洲日韩乱码中文无码蜜桃| 在线播放免费播放av片| 黄色毛片免费网站| 亚洲国产精品无码专区在线观看| 男女作爱在线播放免费网站| 亚洲免费闲人蜜桃| 国产成人精品免费直播| 国内精品免费久久影院| 亚洲免费在线视频播放| 国产成人高清精品免费软件 | 无遮挡免费一区二区三区| 亚洲国产三级在线观看| 最近免费字幕中文大全视频| 亚洲AV色欲色欲WWW| 亚洲啪啪AV无码片| 成人看的午夜免费毛片| 男女一进一出抽搐免费视频| 国产成人精品日本亚洲直接| 亚洲中文字幕无码专区| 亚洲国产成人久久一区WWW|