首頁 >Java >java教程 >java中的多線程知識的總結分析

java中的多線程知識的總結分析

不言
不言原創
2018-09-18 17:17:151727瀏覽

這篇文章帶給大家的內容是關於 java中的多執行緒知識的總結分析,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

進程概述

  1. 進程:正在運行的程序,是系統進行資源分配和呼叫的獨立單位。

  2. 流程就是一個程式在一個資料集上的一次動態執行過程。

  3. 進程一般由程式、資料集、進程控制塊三部分組成。

  4. 每一個行程都有它自己的記憶體空間和系統資源。

  5. 我們寫的程式用來描述流程要完成哪些功能以及如何完成;

  6. 資料集則是程式在執行過程中所需要使用的資源;

  7. 進程控制塊用來記錄進程的外部特徵,描述進程的執行變化過程,系統可以利用它來控制和管理進程,他是系統感知進程存在的唯一識別。

  8. 舉例說明過程:

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

執行緒概述

執行緒的出現是為了降低上下文切換的消耗,提高系統的並發性。

執行緒突破了一個行程只能做一件事的缺陷,使到進程內並發成為可能。

舉例說明線程:

(1)假設一個文字程序,需要接收鍵盤輸入,將內容顯示在螢幕上,還需要將資訊保存到硬碟中。

(2)若只有一個進程,勢必造成同一時間只能做一件事的尷尬,就是說當保存時,不能鍵盤輸入;
(3)若有多個進程,每個進程負責一個任務;
(4)進程A負責鍵盤輸入,進程B負責將內容顯示在螢幕上,進程C負責保存內容到硬碟中;
(5)這裡A、B、C間的協作涉及到了進程通訊問題,而且它們有共同都需要的內容:文字內容;
(6)不停的切換會造成效能上的損失。
(7)若有一種機制,可以使A、B、C可以共享資源;
(8)這樣上下文切換所需要保存和恢復的內容就少了;
(9)同時也可以減少通訊所帶來的效能損耗。
(10)這種機制,就是執行緒。

執行緒也叫輕量級進程。

它是一個基本的cpu執行單元,也是程式執行過程中的最小單元。

由執行緒id、程式計數器、暫存器集合和堆疊共同組成

執行緒的引入減少了程式並發執行時的開銷,提高了作業系統的並發效能。

執行緒沒有自己的系統資源。

行程與執行緒的關係

  1. 程式是電腦中的程式關於某資料集合上的一次執行活動。

  2. 程式是系統進行資源分配和調度的基本單位,是作業系統結構的基礎

  3. 執行緒是一個行程的實體,是cpu調度與分派的基本單位

  4. 執行緒是比行程更小的能獨立運作的基本單位

  5. ##行程與執行緒的關係:
  6. (1)一個執行緒只能屬於一個行程,而一個行程可以有多個執行緒,但至少有一個執行緒
(2)資源分配給行程,而同一行程的所有線程共享該進程的所有資源

(3)cpu分給線程,即真正在cpu上運行的是線程

java程式運行原理

    java指令會啟動java虛擬機,即啟動JVM,等於啟動了一個應用程序,也就是啟動了一個進程;
  1. ##該進程會自動啟動一個主執行緒;
  2. 然後主執行緒去呼叫某個類別的main方法。
  3. 所以main方法運行在主執行緒中,在此之前的所有程式都是單執行緒的
  4. 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處理完畢時,執行緒重新轉入就緒狀態


內功心法:每個物件都有的方法

synchronized、wait、notify是任何物件都具有的同步工具

monitor:

#(1)是套用於同步問題的人工線程調度工具

(2)java的每個物件都有一個監視器,來監測並發程式碼的重入。
(3)在非多執行緒編碼時該監視器不發揮作用,反之如果在synchronized範圍內,監視器發揮作用

wait/notify:二者都必須存在於synchronized區塊中

並且這三個關鍵字針對的是同一個監視器,這意味著wait之後,其他執行緒可以進入同步區塊執行

太祖長拳:基本執行緒類別

  1. Thread類別

  2. Runnable類別

  3. #Callable類別

九陰真經:高階多執行緒控制類別

ThreadLocal類別:

(1)用於保存執行緒的對立變數

(2)當使用ThreadLocal維護變數時,ThreadLocal為每個使用該變數的執行緒提供獨立的變數副本,所以每個執行緒都可以獨立的改變自己的副本,而不會影響其他執行緒所對應的副本。
(3)常用與使用者登陸控制,如記錄session資訊。

原子類別(AtomicInteger/AtomicBoolean)

Lock類別:ReentrantLock/ReentrantReadWriteLock.ReadLock/ReentrantReadWriteLock.WriteLock


########################################################################################################################################################################################################################

以上是java中的多線程知識的總結分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn