java學習(十) —— java中的多線程概述

進程概述

  1. 進程:正在運行的程序,是系統進行資源分配和調用的獨立單位。
  2. 進程就是一個程序在一個數據集上的一次動態執行過程。
  3. 進程通常由程序、數據集、進程控制塊三部分組成。
  4. 每個進程都有它本身的內存空間和系統資源。
  5. 咱們編寫的程序用來描述進程要完成哪些功能以及如何完成;
  6. 數據集則是程序在執行過程當中所須要使用的資源;
  7. 進程控制塊用來記錄進程的外部特徵,描述進程的執行變化過程,系統能夠利用它來控制和管理進程,他是系統感知進程存在的惟一標識。
  8. 舉例說明進程:html

    (1)想象一位有一手好廚藝的計算機科學家正在爲他的女兒烘焙生日蛋糕;
    (2)他有作生日蛋糕的食譜,廚房裏有所須要的原料:麪粉、雞蛋、糖等。
    (3)在這個比喻中,作蛋糕的食譜就是程序;
    (4)計算機科學家就是處理器cpu;
    (5)而作蛋糕的各類原料就是輸入數據。
    (6)進程就是廚師閱讀食譜、取來各類原料、以及烘焙蛋糕等一系列動做的總和。
    (7)如今假設計算機科學家的兒子哭着跑來出來,說他的頭被一隻蜜蜂蟄了;
    (8)計算機科學家就記錄下他照着食譜作到了哪兒了,也就是保存進程的當前狀態;
    (9)而後拿出一本急救手冊,按照其中的指示處理蟄傷;
    (10)這時咱們就看處處理器從一個進程切換到另外一個高優先級的進程;
    (11)每一個進程擁有各自的程序(食譜和急救手冊);
    (12)當蜜蜂蟄傷被處理完成以後,這位計算機科學家又回來作蛋糕;
    (13)從他離開時的那一步繼續進行下去。

線程概述

  1. 線程的出現是爲了下降上下文切換的消耗,提升系統的併發性。
  2. 線程突破了一個進程只能幹一件事的缺陷,使到進程內併發成爲可能。
  3. 舉例說明線程:java

    (1)假設一個文本程序,須要接收鍵盤輸入,將內容顯示在屏幕上,還須要保存信息到硬盤中。
    (2)若只有一個進程,勢必形成同一時間只能幹一件事的尷尬,就是說當保存時,不能鍵盤輸入;
    (3)如有多個進程,每一個進程負責一個任務;
    (4)進程A負責鍵盤輸入,進程B負責將內容顯示在屏幕上,進程C負責保存內容到硬盤中;
    (5)這裏A、B、C間的協做涉及到了進程通訊問題,並且它們有共同都須要的內容:文本內容;
    (6)不停的切換會形成性能上的損失。
    (7)如有一種機制,可使A、B、C能夠共享資源;
    (8)這樣上下文切換所須要保存和恢復的內容就少了;
    (9)同時也能夠減小通訊所帶來的性能損耗。
    (10)這種機制,就是線程。
  4. 線程也叫輕量級進程。
  5. 它是一個基本的cpu執行單元,也是程序執行過程當中的最小單元。
  6. 由線程id、程序計數器、寄存器集合和堆棧共同組成
  7. 線程的引入減少了程序併發執行時的開銷,提升了操做系統的併發性能。
  8. 線程沒有本身的系統資源。

進程與線程的關係

  1. 進程是計算機中的程序關於某數據集合上的一次運行活動。
  2. 進程是系統進行資源分配和調度的基本單位,是操做系統結構的基礎
  3. 線程是進程的一個實體,是cpu調度和分派的基本單位
  4. 線程是比進程更小的能獨立運行的基本單位
  5. 進程與線程的關係:session

    (1)一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程
    (2)資源分配給進程,同一進程的全部線程共享該進程的全部資源
    (3)cpu分給線程,即真正在cpu上運行的是線程

java程序運行原理

  1. java命令會啓動java虛擬機,即啓動JVM,等於啓動了一個應用程序,也就是啓動了一個進程;
  2. 該進程會自動啓動一個主線程;
  3. 而後主線程去調用某個類的main方法。
  4. 因此main方法運行在主線程中,在此以前的全部程序都是單線程的
  5. jvm啓動是多線程的:多線程

    (1)由於在jvm啓動的時候垃圾回收線程也要啓動,不然很容易會出現內存溢出;
    (2)如今的垃圾回收線程加上前面的主線程,最少啓動了兩個線程,因此,jvm的啓動是多線程的。

涉及到多線程的內容分紅幾部分:

  1. 紮好馬步:線程的狀態
  2. 內功心法:每一個對象都有的方法(機制)
  3. 太祖長拳:基本線程類
  4. 九陰真經:高級多線程控制類

紮好馬步:線程的狀態(五種)

  1. New:新建狀態,當線程對象創立後,即進入了新建狀態,如:Thread t = new MyThread()
  2. Runnable:就緒狀態,當調用線程對象的start()方法(t.start()),線程就進入就緒狀態。處於就緒狀態的線程,只是說明此線程已經作好了準備,隨時等待cpu調度執行,並非說執行了t.start()此線程當即就會執行
  3. Running:運行狀態,當cpu開始調度處於就緒狀態的線程時,此時線程才得以真正執行,即進入到運行狀態。
  4. Blocked:阻塞狀態,處於運行狀態中的線程因爲某種緣由,暫時放棄對cpu的使用權,中止執行,此時進入阻塞狀態,直到其進入到就緒狀態,纔有機會再次被cpu調用以進入到運行狀態
  5. Dead:死亡狀態,線程執行完了或者因異常退出了run()方法,該線程結束生命週期
  6. 注意:併發

    (1)就緒狀態是進入到運行狀態的惟一入口
    (2)線程想要進入到運行狀態執行,首先必須處於就緒狀態中
    (3)根據阻塞產生的緣由,阻塞狀態又能夠分爲三種:
        【1】等待阻塞:運行狀態中的線程執行wait()方法,使本線程進入到等待阻塞狀態
        【2】同步阻塞:線程在獲取synchronized同步鎖失敗(由於鎖被其餘線程佔用),它會進入同步阻塞狀態
        【3】其餘阻塞:經過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程從新轉入就緒狀態

內功心法:每一個對象都有的方法

  1. synchronized、wait、notify是任何對象都具備的同步工具
  2. monitor:jvm

    (1)是應用於同步問題的人工線程調度工具
    (2)java的每一個對象都有一個監視器,來監測併發代碼的重入。
    (3)在非多線程編碼時該監視器不發揮做用,反之若是在synchronized範圍內,監視器發揮做用
  3. wait/notify:兩者都必須存在於synchronized塊中
  4. 而且這三個關鍵字針對的是同一個監視器,這意味着wait以後,其餘線程能夠進入同步塊執行

太祖長拳:基本線程類

  1. Thread類
  2. Runnable類
  3. Callable類

九陰真經:高級多線程控制類

  1. ThreadLocal類:工具

    (1)用於保存線程的對立變量
    (2)當使用ThreadLocal維護變量時,ThreadLocal爲每一個使用該變量的線程提供獨立的變量副本,因此每個線程均可以獨立的改變本身的副本,而不會影響其餘線程所對應的副本。
    (3)經常使用與用戶登錄控制,如記錄session信息。
  2. 原子類(AtomicInteger/AtomicBoolean)
  3. Lock類:ReentrantLock/ReentrantReadWriteLock.ReadLock/ReentrantReadWriteLock.WriteLock

參考連接

https://www.cnblogs.com/wxd01...性能

相關文章
相關標籤/搜索