<nav id="iugoa"></nav>
  • <xmp id="iugoa"><menu id="iugoa"></menu>
    <menu id="iugoa"><strong id="iugoa"></strong></menu>
  • <nav id="iugoa"></nav>
    <menu id="iugoa"></menu>
    <menu id="iugoa"><strong id="iugoa"></strong></menu>
    Java知識分享網 - 輕松學習從此開始!????

    Java知識分享網

    Java1234官方群24:java1234官方群24
    Java1234官方群24:791563025
         

    SVN視頻教程(結合eclipse,idea)免費領取

    畢設代做,包查重聯系人QQ:1982956321畢設大神

    領取國內優秀就業,加薪,跳槽項目課程源碼-vue2+jwt+springboot+mybaits前后端分離通訊錄系統課程

    SpringBoot打造企業級進銷存

    Java1234 VIP課程

    領取微信掃碼登錄Java實現視頻教程

    Java1234至尊VIP(特價活動)
    當前位置: 主頁 > Java文檔 > Java基礎相關 >

    Java多線程與并發編程總結 PDF 下載


    分享到:
    時間:2020-04-15 16:45來源:http://www.gemtrap.cn 作者:小鋒  侵權舉報
    Java多線程與并發編程總結 PDF 下載
    失效鏈接處理
    Java多線程與并發編程總結  PDF 下載

    本站整理下載:
     
    相關截圖:
     
    主要內容:

     認識多任務、多進程、單線程、多線程 
      要認識多線程就要從操作系統的原理說起。
      以前古老的DOS操作系統(V 6.22)是單任務的,還沒有線程的概念,系統在每次只能做一件事情。比如你在copy東西的時候不能rename文件名。為了提高系統的利用效率,采用批處理來批量執行任務。
      現在的操作系統都是多任務操作系統,每個運行的任務就是操作系統所做的一件事情,比如你在聽歌的同時還在用MSN和好友聊天。聽歌和聊天就是兩個任務,這個兩個任務是“同時”進行的。一個任務一般對應一個進程,也可能包含好幾個進程。比如運行的MSN就對應一個MSN的進程,如果你用的是windows系統,你就可以在任務管理器中看到操作系統正在運行的進程信息。
      一般來說,當運行一個應用程序的時候,就啟動了一個進程,當然有些會啟動多個進程。啟動進程的時候,操作系統會為進程分配資源,其中最主要的資源是內存空間,因為程序是在內存中運行的。在進程中,有些程序流程塊是可以亂序執行的,并且這個代碼塊可以同時被多次執行。實際上,這樣的代碼塊就是線程體。線程是進程中亂序執行的代碼流程。當多個線程同時運行的時候,這樣的執行模式成為并發執行。
      多線程的目的是為了最大限度的利用CPU資源。
      Java編寫程序都運行在在Java虛擬機(JVM)中,在JVM的內部,程序的多任務是通過線程來實現的。每用java命令啟動一個java應用程序,就會啟動一個JVM進程。在同一個JVM進程中,有且只有一個進程,就是它自己。在這個JVM環境中,所有程序代碼的運行都是以線程來運行。
      一般常見的Java應用程序都是單線程的。比如,用java命令運行一個最簡單的HelloWorld的Java應用程序時,就啟動了一個JVM進程,JVM找到程序程序的入口點main(),然后運行main()方法,這樣就產生了一個線程,這個線程稱之為主線程。當main方法結束后,主線程運行完成。JVM進程也隨即退出。
      對于一個進程中的多個線程來說,多個線程共享進程的內存塊,當有新的線程產生的時候,操作系統不分配新的內存,而是讓新線程共享原有的進程塊的內存。因此,線程間的通信很容易,速度也很快。不同的進程因為處于不同的內存塊,因此進程之間的通信相對困難。
      實際上,操作的系統的多進程實現了多任務并發執行,程序的多線程實現了進程的并發執行。多任務、多進程、多線程的前提都是要求操作系統提供多任務、多進程、多線程的支持。
      在Java程序中,JVM負責線程的調度。線程調度是值按照特定的機制為多個線程分配CPU的使用權。
      調度的模式有兩種:分時調度和搶占式調度。分時調度是所有線程輪流獲得CPU使用權,并平均分配每個線程占用CPU的時間;搶占式調度是根據線程的優先級別來獲取CPU的使用權。JVM的線程調度模式采用了搶占式模式。
      所謂的“并發執行”、“同時”其實都不是真正意義上的“同時”。眾所周知,CPU都有個時鐘頻率,表示每秒中能執行cpu指令的次數。在每個時鐘周期內,CPU實際上只能去執行一條(也有可能多條)指令。操作系統將進程線程進行管理,輪流(沒有固定的順序)分配每個進程很短的一段是時間(不一定是均分),然后在每個線程內部,程序代碼自己處理該進程內部線程的時間分配,多個線程之間相互的切換去執行,這個切換時間也是非常短的。因此多任務、多進程、多線程都是操作系統給人的一種宏觀感受,從微觀角度看,程序的運行是異步執行的。
      用一句話做總結:雖然操作系統是多線程的,但CPU每一時刻只能做一件事,和人的大腦是一樣的,呵呵。
            Java語言的多線程需要操作系統的支持。
      Java 虛擬機允許應用程序并發地運行多個執行線程。Java語言提供了多線程編程的擴展點,并給出了功能強大的線程控制API。
      在Java中,多線程的實現有兩種方式:
      擴展java.lang.Thread類
      實現java.lang.Runnable接口
      每個線程都有一個優先級,高優先級線程的執行優先于低優先級線程。每個線程都可以或不可以標記為一個守護程序。當某個線程中運行的代碼創建一個新 Thread 對象時,該新線程的初始優先級被設定為創建線程的優先級,并且當且僅當創建線程是守護線程時,新線程才是守護程序。
      當 Java 虛擬機啟動時,通常都會有單個非守護線程(它通常會調用某個指定類的 main 方法)。Java 虛擬機會繼續執行線程,直到下列任一情況出現時為止:
      調用了 Runtime 類的 exit 方法,并且安全管理器允許退出操作發生。
      非守護線程的所有線程都已停止運行,無論是通過從對 run 方法的調用中返回,還是通過拋出一個傳播到 run 方法之外的異常。
        擴展java.lang.Thread類 
      運行結果:
      main 線程運行開始!
      main 線程運行結束!
      A 線程運行開始!
      0 A
      1 A
      B 線程運行開始!
      2 A
      0 B
      3 A
      4 A
      1 B
      5 A
      6 A
      7 A
      8 A
      9 A
      A 線程運行結束!
      2 B
      3 B
      4 B
      5 B
      6 B
      7 B
      8 B
      9 B
      B 線程運行結束!
      說明:
      程序啟動運行main時候,java虛擬機啟動一個進程,主線程main在main()調用時候被創建。隨著調用MitiSay的兩個對象的start方法,另外兩個線程也啟動了,這樣,整個應用就在多線程下運行。
      在一個方法中調用Thread.currentThread().getName()方法,可以獲取當前線程的名字。在mian方法中調用該方法,獲取的是主線程的名字。
      注意:start()方法的調用后并不是立即執行多線程代碼,而是使得該線程變為可運行態(Runnable),什么時候運行是由操作系統決定的。
      從程序運行的結果可以發現,多線程程序是亂序執行。因此,只有亂序執行的代碼才有必要設計為多線程。
      Thread.sleep()方法調用目的是不讓當前線程獨自霸占該進程所獲取的CPU資源,以留出一定時間給其他線程執行的機會。
      實際上所有的多線程代碼執行順序都是不確定的,每次執行的結果都是隨機的。

     

    ------分隔線----------------------------
    鋒哥公眾號


    鋒哥微信號


    在线aav片线 - 视频 - 在线观看 - 影视资讯 - 品爱网