JAVA 多線程和併發學習筆記(四)

1. 多進程編程

  實現併發最直接的方式是在操做系統級別使用進程,進程是運行在它本身的地址空間內的自包容的程序。多任務操做系統能夠經過週期性地將CPU從一個進程切換到另外一個進程,來實現同時運行多個進程。 儘管對於一個CPU而言,它在某個時間點只能運行一個進程,但CPU能夠在多個進程之間進行輪換執行,而且CPU的切換速度極高,使咱們沒法感知其切換的過程,就好像有多個進程在同時執行。瀏覽器

  幾乎全部的操做系統都支持進程的概念,全部運行中的任務一般對應一個進程(Process)。當一個程序進入內存運行時,即變成一個進程。進程是處於運行過程當中的程序,而且具備必定的獨立功能,進程是系統進行資源分配和調度的一個獨立單位。通常而言,進程包含以下3個特徵:服務器

  • 獨立性:進程是系統中獨立存在的實體,它能夠擁有本身獨立的資源,每個進程都擁有本身私有的地址空間。在沒有通過進程自己容許的狀況下,一個用戶進程不能夠直接訪問其餘進程的地址空間。
  • 動態性:進程與程序的區別在於,程序只是一個靜態的指令集合,而進程是一個正在系統中活動的指令集合。在進程中加入了時間的概念,進程具備本身的生命週期和各類不一樣的狀態,這些概念在程序中部是不具有的。
  • 併發性:多個進程能夠在單個處理器上併發執行,多個進程之間不會互相影響。

2 多線程多線程

2.1 多線程概述併發

  多線程則擴展了多進程的概念,用於實現併發。使得同一個進程中也能夠同時併發處理多個任務。線程(Thread)也被稱做輕量級進程(Lightweight Process)。線程是進程的執行單元,就像進程在操做系統中的地位同樣,線程在程序中是獨立的、併發的執行流。當進程被初始化後,主線程就被建立了。對於絕大多數的應用程序來講,一般僅要求有一個主線程,但也能夠在該進程內建立多條順序執行流,這些順序執行流就是線程,每一個線程也是互相獨立的。性能

  線程是進程的組成部分,一個進程能夠擁有多個線程,一個線程必須有一個父進程。線程能夠擁有本身的堆棧、本身的程序計數器和本身的局部變量,但不擁有系統資源,它與父進程的其餘線程共享該進程所擁有的所有資源。由於多個線程共享父進程裏的所有資源,所以編程更加方便;但必須更加當心,咱們必須確保線程不會妨礙同一進程裏的其餘線程。spa

2.2 多線程機制操作系統

  線程模型爲編程帶來了便利,它簡化了在單一程序中同時交織在一塊兒的多個操做的處理。在使用線程時,CPU將輪流給每一個任務分配其佔用時間。每一個任務都以爲本身在一直佔用CPU,但事實上CPU時間是劃分紅片斷分配給了全部的任務。線程的一大好處是可使你從這個層次抽身出來,即代碼沒必要知道它是運行在具備一個仍是多個CPU的機器上。因此,使用線程機制是一種創建透明的、可擴展的程序的方法,若是程序行得太慢,爲機器增添一個CPU就能很容易地加快程序的運行速度。多任務和多線程每每是使用多處理器系統的最合理方式。線程

2.3 多線程調度生命週期

  線程能夠完成必定的任務,能夠與其餘線程共享父進程中的共享變量及部分環境,相互之間協同來完成進程所要完成的任務。線程是獨立運行的,它並不知道進程中是否還有其餘線程存在,線程的執行是搶佔式的,也就是說,當前運行的線程在任什麼時候候均可能被掛起,以便另一個線程能夠運行。

  一個線程能夠建立和撤銷另外一個線程,同一個進程中的多個線程之間能夠併發執行。從邏輯角度來看,多線程存在於一個應用程序中,讓一個應用程序中能夠有多個執行部分同時執行,但操做系統無須將多個線程看做多個獨立的應用,對多線程實現調度和管理以及資源分配。線程的調度和管理由進程自己負責完成。

  概括起採能夠這樣說:操做系統能夠同時執行多個任務,每一個任務就是進程;進程能夠同時執行多個任務,每一個任務就是線程。簡而言之,一個程序運行後至少有一個進程,一個進程裏能夠包含多個線程,但至少要包含一個線程。

2.4 多線程的優點

  線程在程序中是獨立的、併發的執行流,與分隔的進程相比,進程中線程之間的隔離程度要小

  它們共享內存、文件句柄和其餘每一個進程應有的狀態。由於線程的劃分尺度小於進程,使得多線程程序的併發性高。進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存,從而極大地提升了程序的運行效率

  線程比進程具備更高的性能,這是因爲同一個進程中的線程都有共性----多個線程共享同一個進程虛擬空間。線程共享的環境包括進程代碼段、進程的公有數據等。利用這些共享的數據,線程很容易實現相互之間的通訊

  當操做系統建立一個進程時,必須爲該進程分配獨立的內存空間,並分配大量的相關資源;但建立一個線程則簡單得多,所以使用多線程來實現併發比使用多進程實現併發的性能要高得多

  • 總結起來,使用多線程編程具備以下幾個優勢:
  • 進程之間不能共享內存,但線程之間共享內存很是容易
  • 系統建立進程時須要爲該進程從新分配系統資源,但建立線程則代價小得多,所以使用多線程來實現多任務併發比多進程的效率高
  • Java語言內置了多線程功能支持,而不是單純地做爲底層操做系統的調度方式,從而簡化了Java的多線程編程

在實際應用中,多線程是很是有用的,一個瀏覽器必須能同時下載多個圖片;一個Web服務器必須能同時響應多個用戶請求;Java虛擬機自己就在後臺提供了一個超級線程來進行垃圾回收;圖形用戶界面(GUI)應用也須要啓動單獨的線程從主機環境收集用戶界面事件……總之,多線程在實際編程中的應用是很是普遍的.

相關文章
相關標籤/搜索