前言
大家好啊,我是湯小圓。
今天給大家推薦的是,進(jìn)程與線程的入門知識,希望對大家有幫助,謝謝。
簡介
首先用術(shù)語來講一下,進(jìn)程是系統(tǒng)進(jìn)行資源調(diào)度和分配的基本單元,線程是進(jìn)程的最小執(zhí)行單元;
比如Windows中的任務(wù)管理器,就可以看到正在運行的進(jìn)程,如下所示

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)程,為啥還要有線程呢?
-
每個進(jìn)程都有自己獨立的數(shù)據(jù)空間,進(jìn)程之間不共享這些數(shù)據(jù)資源,通訊不方便;
但是線程不一樣,一個進(jìn)程內(nèi)的多個線程共享這個進(jìn)程的數(shù)據(jù)資源,通訊方便
-
多進(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ù)安全呢?
有多種方式:
局部變量,即單個線程內(nèi)定義的局部變量只有自己可見,那肯定是安全的
只讀對象,即共享的對象是只讀的,那肯定也是安全的
線程安全類,即類本身是線程安全的,那么基于這個類的操作肯定也是安全,比如StringBuffer類
同步與鎖機(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)互通的

7. 那么線程的創(chuàng)建 New 有幾種方式呢?
三種
(不推薦)繼承Thread類,但是這樣的話不符合LSP原則(里氏替換原則,詳細(xì)內(nèi)容可參考:http://www.itdecent.cn/p/cf9f3c7c0df5)
(推薦)實現(xiàn)Runnable接口,比第一種靈活,也更加安全
(推薦)實現(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é)的話東西還是很多的
參考書籍:
Java并發(fā)編程實戰(zhàn)
實戰(zhàn)Java高并發(fā)程序設(shè)計(第二版)
參考鏈接:
后記
最后,感謝大家的觀看,謝謝。