Java進階(四十三)線程與進程的區別

      網友投稿 766 2022-05-29

      #Java進階(四十三)線程與進程的區別

      ##1、線程的基本概念

      概念:線程是進程中執行運算的最小單位,是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以并發執行。

      好處:

      (1)易于調度。

      (2)提高并發性。通過線程可方便有效地實現并發性。進程可創建多個線程來執行同一程序的不同部分。

      (3)開銷少。創建線程比創建進程要快,所需開銷很少。

      (4)利于充分發揮多處理器的功能。通過創建多線程進程,每個線程在一個處理器上運行,從而實現應用程序的并發性,使每個處理器都得到充分運行。

      ##2、進程的基本狀態及狀態之間的關系

      ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/297cce195d989e1d706795e628d42c45.png)

      詳見博文《 Java進階(四十一)多線程講解》。

      ##3、線程和進程的關系以及區別

      ###進程和線程的關系

      (1)一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程。

      (2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。

      (3)處理機分給線程,即真正在處理機上運行的是線程。

      (4)線程在執行過程中,需要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。線程是指進程內的一個執行單元,也是進程內的可調度實體.

      ###進程與線程的區別

      (1)調度:線程作為調度和分配的基本單位,進程作為擁有資源的基本單位。

      (2)并發性:不僅進程之間可以并發執行,同一個進程的多個線程之間也可并發執行。

      (3)擁有資源:進程是擁有資源的一個獨立單位,線程不擁有系統資源,但可以訪問隸屬于進程的資源。

      (4)系統開銷:在創建或撤消進程時,由于系統都要為之分配和回收資源,導致系統的開銷明顯大于創建或撤消線程時的開銷。

      ##4、進程間通信的方式

      ###(1)管道(pipe)及有名管道(named pipe)

      管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系;有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。

      ###(2)信號(signal)

      信號是在軟件層次上對中斷機制的一種模擬,它是比較復雜的通信方式,用于通知進程有某事件發生,一個進程收到一個信號與處理器收到一個中斷請求效果上可以說是一致的。

      ###(3)信號量(semaphore)

      信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程之間及同一種進程的不同線程之間的同步和互斥手段。

      ###(4)消息隊列(message queue)

      消息隊列是由消息的鏈表,存放在內核中并由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。具有寫權限的進程可以按照一定的規則向消息隊列中添加新信息;對消息隊列有讀權限的進程則可以從消息隊列中讀取信息。

      ###(5)共享內存(shared memory)

      可以說這是最有用的進程間通信方式。它使得多個進程可以訪問同一塊內存空間,不同進程可以及時看到對方進程中對共享內存中數據的更新。這種方式需要依靠某種同步操作,如互斥鎖和信號量等。共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。

      ###(6)套接字(socket)

      這是一種更為一般的進程間通信機制,它可用于網絡中不同機器之間的進程間通信,應用非常廣泛。

      ##5、線程間通信的方式

      ###鎖機制

      包括互斥鎖、條件變量、讀寫鎖

      互斥鎖提供了以排他方式防止數據結構被并發修改的方法。

      讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的。

      條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。

      ###信號量機制(Semaphore)

      包括無名線程信號量和命名線程信號量。

      ###信號機制(Signal)

      類似進程間的信號處理。

      線程間的通信目的主要是用于線程同步,所以線程沒有像進程通信中的用于數據交換的通信機制。

      ###管道(Pipe)

      示例代碼如下:

      package cn.edu.ujn.demo; import java.io.PipedReader; import java.io.PipedWriter; public class Piped { public static void main(String[] args) throws Exception{ PipedWriter out = new PipedWriter(); PipedReader in = new PipedReader(); // 連接輸入流和輸出流,否則會報異常:java.io.IOException: Pipe not connected out.connect(in); Thread printThread = new Thread(new Print(in), "PrintThread"); printThread.start(); int receive = 0; try { while((receive = System.in.read()) != -1){ out.write(receive); } } catch (Exception e) { e.printStackTrace(); }finally{ out.close(); } } } class Print implements Runnable{ private PipedReader in; public Print(PipedReader in){ this.in = in; } public void run(){ int receive = 0; try { while((receive = in.read()) != -1){ System.out.print((char)receive); } } catch (Exception e) { e.printStackTrace(); } } }

      1

      2

      3

      4

      Java進階(四十三)線程與進程的區別

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      ##6、同步和互斥的區別

      當有多個線程的時候,經常需要去同步這些線程以訪問同一個數據或資源。例如,假設有一個程序,其中一個線程用于把文件寫到內存,而另一個線程用于統計文件中的字符數。當然,在把整個文件調入內存之前,統計它的字符數是沒有意義的。但是,由于每個操作都有自己的線程,操作系統會把兩個線程當作是互不相干的任務分別執行,這樣就可能在沒有把整個文件裝入內存時統計字符數。為解決此問題,你必須使兩個線程同步工作。

      所謂同步,是指散布在不同進程之間的若干程序片斷,它們的運行必須嚴格按照規定的某種先后次序來運行,這種先后次序依賴于要完成的特定的任務。如果用對資源的訪問來定義的話,同步是指在互斥的基礎上(大多數情況),通過其它機制實現訪問者對資源的有序訪問。在大多數情況下,同步已經實現了互斥,特別是所有寫入資源的情況必定是互斥的。少數情況是指可以允許多個訪問者同時訪問資源。

      所謂互斥,是指散布在不同進程之間的若干程序片斷,當某個進程運行其中一個程序片段時,其它進程就不能運行它們之中的任一程序片段,只能等到該進程運行完這個程序片段后才可以運行。如果用對資源的訪問來定義的話,互斥某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。

      ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/5ccfa1009c03947840196de4004ba295.png) ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/d502db58434685a1eb635cabcccb0029.png) ![這里寫圖片描述](https://img-blog.csdnimg.cn/img_convert/32ad2882d4917a68290c6c677e5e3229.png)

      Java 任務調度

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:項目實踐之工作流引擎基本文檔!Activiti工作流框架之流程引擎API和服務詳解
      下一篇:多線程轉賬代碼示例
      相關文章
      日韩精品亚洲专区在线观看| 亚洲精品中文字幕无码A片老| 国产精品亚洲精品爽爽| 亚洲精品456人成在线| 久久精品a亚洲国产v高清不卡| 亚洲成AV人片在线观看无 | 日韩va亚洲va欧洲va国产| 亚洲综合av永久无码精品一区二区| 国产成人亚洲综合无| 婷婷国产偷v国产偷v亚洲| 苍井空亚洲精品AA片在线播放 | 亚洲婷婷五月综合狠狠爱| 亚洲中文字幕无码一区| 国产亚洲成av片在线观看| 亚洲av中文无码乱人伦在线播放 | 亚洲1区2区3区精华液| 久久亚洲精品无码gv| 亚洲av中文无码| 国产精品亚洲精品日韩已方| 国内精品久久久久久久亚洲| 亚洲欧洲自拍拍偷午夜色无码| 亚洲av永久无码精品古装片| 亚洲国产高清在线| 亚洲国色天香视频| 国产亚洲精aa在线看| 亚洲AV无码资源在线观看| 亚洲国产成人五月综合网| 国产精品亚洲mnbav网站| 亚洲第一AV网站| 亚洲系列国产精品制服丝袜第| 亚洲AV综合色区无码二区偷拍| 一区二区亚洲精品精华液| 九九精品国产亚洲AV日韩| 亚洲VA综合VA国产产VA中| 国产亚洲?V无码?V男人的天堂| 欧洲亚洲国产清在高| 久久久久亚洲精品日久生情| 亚洲18在线天美| 国产偷国产偷亚洲清高APP| 亚洲另类激情专区小说图片| 日本红怡院亚洲红怡院最新|