進(jìn)程與線程 入門知識篇

前言

大家好啊,我是湯小圓。

今天給大家推薦的是,進(jìn)程與線程的入門知識,希望對大家有幫助,謝謝。

簡介

首先用術(shù)語來講一下,進(jìn)程是系統(tǒng)進(jìn)行資源調(diào)度和分配的基本單元,線程是進(jìn)程的最小執(zhí)行單元;

比如Windows中的任務(wù)管理器,就可以看到正在運行的進(jìn)程,如下所示


進(jìn)程-win10.png

PS:這里要注意一點,程序不等于進(jìn)程

程序是指令的集合,是靜態(tài)的;進(jìn)程是正在執(zhí)行的程序,是活的

當(dāng)你雙擊運行程序(.exe文件)時,程序的指令會加載到內(nèi)存中,此時你就會得到這個程序的進(jìn)程

好了,術(shù)語講完了,接下來開始講人話

知識點

1. 進(jìn)程和線程的關(guān)系是怎么樣的呢?

進(jìn)程可以看作一個容器,線程就是容器內(nèi)的最小執(zhí)行單元;

我們用一個例子來說明,比如有一個宿舍(進(jìn)程),宿舍里有兩個人(線程),一個廁所(共享資源)

宿舍和人的關(guān)系就是進(jìn)程和線程的關(guān)系

一個進(jìn)程可以包含多個線程。

2. 既然有了進(jìn)程,為啥還要有線程呢?

  1. 每個進(jìn)程都有自己獨立的數(shù)據(jù)空間,進(jìn)程之間不共享這些數(shù)據(jù)資源,通訊不方便;

    但是線程不一樣,一個進(jìn)程內(nèi)的多個線程共享這個進(jìn)程的數(shù)據(jù)資源,通訊方便

  2. 多進(jìn)程之間切換開銷大;

    但是多線程不會,線程來回切換開銷很小

    (這里簡單解釋下,引入一個虛擬空間的概念,多個進(jìn)程擁有不同的虛擬空間和緩存,但是多個線程共享進(jìn)程的虛擬空間和緩存,進(jìn)程切換之后,緩存失效,要重新去尋址虛擬空間,但是線程因為共享空間,緩存還是可以用的,所以比進(jìn)程快)

3. 多線程都有哪些好處呢?

多線程相互協(xié)作,重復(fù)利用系統(tǒng)資源,提高系統(tǒng)吞吐率

如果只是單個線程,那么程序在執(zhí)行比較耗時的操作(比如IO)時,CPU 是處于空閑的狀態(tài),就會造成資源的浪費

但是多線程可以切換到其他線程,繼續(xù)執(zhí)行其他任務(wù),從而充分利用CPU

比如我們在看電影的時候,眼睛在工作,耳朵也在工作,這樣就可以充分利用我們的身體去享受電影;

但是如果眼睛和耳朵要分開工作,那就難受了(腦補一下聲音畫面不同步的場景)

4. 多線程要怎么確保數(shù)據(jù)安全呢?

有多種方式:

  1. 局部變量,即單個線程內(nèi)定義的局部變量只有自己可見,那肯定是安全的

  2. 只讀對象,即共享的對象是只讀的,那肯定也是安全的

  3. 線程安全類,即類本身是線程安全的,那么基于這個類的操作肯定也是安全,比如StringBuffer類

  4. 同步與鎖機(jī)制,即用戶自己通過加鎖,來確保數(shù)據(jù)安全;這個會導(dǎo)致程序變得復(fù)雜且容易出現(xiàn)問題

5. 線程的生命周期都有哪些呢?

通過JDK源碼可以看到,線程的生命周期有6個狀態(tài),如下所示

public enum State {
 NEW, // 創(chuàng)建了線程,但是啥也沒干
 RUNNABLE, // 啟動了線程,處于運行狀態(tài)
 BLOCKED, // 阻塞了線程,處于阻塞狀態(tài)
 WAITING, // 等待狀態(tài),沒有時間限制,直到有其他事件通知
 TIMED_WAITING, // 等待狀態(tài),有時間限制,時間到了,會返回到運行狀態(tài)
 TERMINATED; // 終止?fàn)顟B(tài),線程結(jié)束
 }

6. 這些狀態(tài)之間的關(guān)系是咋樣的呢?

可以用一張圖來描述,如下所示,可以看到除了NEW狀態(tài)和TERMINATED狀態(tài),其他狀態(tài)都是跟RUNNABLE狀態(tài)互通的

線程狀態(tài)圖.png

7. 那么線程的創(chuàng)建 New 有幾種方式呢?

三種

  1. (不推薦)繼承Thread類,但是這樣的話不符合LSP原則(里氏替換原則,詳細(xì)內(nèi)容可參考:http://www.itdecent.cn/p/cf9f3c7c0df5

  2. (推薦)實現(xiàn)Runnable接口,比第一種靈活,也更加安全

  3. (推薦)實現(xiàn)Callable接口,相比于第二種,多了返回值異常拋出

8. BLOCKED 狀態(tài)一般什么情況下會出現(xiàn)呢?

遇到鎖的情況下,如果鎖沒有釋放,那么線程就會阻塞

9. WAITING 和 TIMED_WAITING有啥區(qū)別,不都是等待狀態(tài)嗎?

WAITING 狀態(tài)會無休止的等待下去,直到其他事件通知它,它才會停止等待,進(jìn)入RUNNABLE狀態(tài)(被動)

TIMED_WAITING 狀態(tài)會有一個等待最長時間,如果到了等待最長時間,還沒有人通知它,它會自動停止等待,進(jìn)入RUNNABLE狀態(tài)(被動+主動)

總結(jié)

上面只是簡單介紹了線程和進(jìn)程,真正要學(xué)的話東西還是很多的

參考書籍

  1. Java并發(fā)編程實戰(zhàn)

  2. 實戰(zhàn)Java高并發(fā)程序設(shè)計(第二版)

參考鏈接

  1. 里氏替換原則:http://www.itdecent.cn/p/cf9f3c7c0df5

后記

最后,感謝大家的觀看,謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容