Java進(jìn)程與線程介紹及如何實(shí)現(xiàn)
1.前言
哈嘍大家好吖,今天來給大家分享這一段時(shí)間剛上手的Java多線程的學(xué)習(xí),多線程在以后實(shí)際項(xiàng)目開發(fā)中是一個(gè)十分核心的內(nèi)容,需要認(rèn)真學(xué)習(xí)并加以掌握,剛上手概念比較多,希望大家沉下心來慢慢學(xué)習(xí),那么讓我們開始這一部分的學(xué)習(xí)吧。
2.正文
在介紹線程之前,需要先講解以下進(jìn)程相關(guān)的概念,進(jìn)程與線程之間息息相關(guān),并且以后面試的時(shí)候會(huì)對(duì)這部分的原理內(nèi)容進(jìn)行考察。
2.1什么是進(jìn)程
進(jìn)程(Process) 是計(jì)算機(jī)中執(zhí)行的程序的實(shí)例。它是操作系統(tǒng)分配資源和調(diào)度的基本單位。進(jìn)程不僅包含程序代碼本身,還包括程序執(zhí)行時(shí)所需的資源和環(huán)境。每個(gè)進(jìn)程都有獨(dú)立的內(nèi)存空間、寄存器、堆棧、程序計(jì)數(shù)器等,它們使進(jìn)程能夠在多任務(wù)操作系統(tǒng)中并發(fā)執(zhí)行而不互相干擾。
如何在電腦上查看進(jìn)程呢,其實(shí)很簡(jiǎn)單,打開任務(wù)管理器:

可以看到這里就標(biāo)記著進(jìn)程,當(dāng)我們點(diǎn)到任務(wù)管理器詳細(xì)信息一欄時(shí),每一個(gè)進(jìn)程的相關(guān)信息都會(huì)展示出來,這里先大概感知一下進(jìn)程到底是什么。
2.2PCB(進(jìn)程控制塊)
操作系統(tǒng)通過管理進(jìn)程來實(shí)現(xiàn)多任務(wù)操作,每個(gè)進(jìn)程在操作系統(tǒng)中都有一個(gè)對(duì)應(yīng)的進(jìn)程控制塊(PCB),用于存儲(chǔ)進(jìn)程的狀態(tài)、程序計(jì)數(shù)器、寄存器等信息。當(dāng)發(fā)生上下文切換時(shí),操作系統(tǒng)會(huì)保存當(dāng)前進(jìn)程的狀態(tài),加載另一個(gè)進(jìn)程的狀態(tài),從而實(shí)現(xiàn)進(jìn)程間的切換。
下面是PCB的相關(guān)屬性:
2.2.1進(jìn)程id
PCB中的進(jìn)程ID(Process ID,PID) 是操作系統(tǒng)用來唯一標(biāo)識(shí)進(jìn)程的一個(gè)標(biāo)識(shí)符。每個(gè)進(jìn)程在操作系統(tǒng)中都有一個(gè)獨(dú)一無二的PID,它用于區(qū)分不同的進(jìn)程并在進(jìn)程管理中進(jìn)行調(diào)度、監(jiān)控和資源分配。

特點(diǎn):
- 唯一性
- 每個(gè)進(jìn)程都有一個(gè)唯一的PID,操作系統(tǒng)保證同一時(shí)刻不會(huì)有兩個(gè)進(jìn)程擁有相同的PID。
- 生命周期
- 當(dāng)一個(gè)進(jìn)程創(chuàng)建時(shí),操作系統(tǒng)為其分配一個(gè)PID;當(dāng)進(jìn)程終止時(shí),PID被釋放,操作系統(tǒng)可以將其分配給新的進(jìn)程。
2.2.2內(nèi)存指針
內(nèi)存指針(Memory Pointer)是一個(gè)重要的字段,用于保存與進(jìn)程相關(guān)的內(nèi)存管理信息。這個(gè)指針幫助操作系統(tǒng)追蹤進(jìn)程使用的內(nèi)存區(qū)域,包括代碼、數(shù)據(jù)、堆棧等。
內(nèi)存指針都指向什么,都有什么作用呢:
- 如果這個(gè)指針存儲(chǔ)進(jìn)程執(zhí)行的代碼,那么會(huì)使CPU能夠正確地加載和執(zhí)行指令。
- 如果這個(gè)指針指向數(shù)據(jù)段,那么會(huì)使操作系統(tǒng)在運(yùn)行時(shí)管理數(shù)據(jù)的訪問。
2.2.3文件描述符表
文件描述符表是一個(gè)非常重要的字段,它用來管理進(jìn)程與操作系統(tǒng)中文件的關(guān)系。文件描述符表存儲(chǔ)著進(jìn)程打開的文件的相關(guān)信息,每個(gè)文件在操作系統(tǒng)中都有一個(gè)唯一的標(biāo)識(shí)符——文件描述符。這些文件描述符用于指代進(jìn)程當(dāng)前使用的文件資源,并為操作系統(tǒng)提供對(duì)這些文件的管理和訪問。
- 作用:
- 文件描述符表用于將進(jìn)程與打開的文件建立關(guān)聯(lián)。當(dāng)一個(gè)進(jìn)程打開文件時(shí),操作系統(tǒng)會(huì)為該文件分配一個(gè)文件描述符,并將其存儲(chǔ)在進(jìn)程的文件描述符表中。這個(gè)描述符使進(jìn)程能夠通過標(biāo)識(shí)符訪問文件,而不需要知道文件的具體位置或物理存儲(chǔ),類似于一個(gè)特殊的指針
- 文件描述符表中的每個(gè)條目對(duì)應(yīng)一個(gè)打開的文件,操作系統(tǒng)可以根據(jù)文件描述符來執(zhí)行文件的讀寫、關(guān)閉、定位等操作。
2.2.4進(jìn)程狀態(tài)
PCB中同樣存儲(chǔ)著當(dāng)前進(jìn)程的狀態(tài),下面那是倆個(gè)常見重要的進(jìn)程狀態(tài)。

2.2.4.1就緒狀態(tài)
進(jìn)程已經(jīng)準(zhǔn)備好運(yùn)行,但由于CPU正在執(zhí)行其他進(jìn)程,因此處于等待中。操作系統(tǒng)將進(jìn)程放入就緒隊(duì)列,等待調(diào)度器選擇該進(jìn)程進(jìn)行執(zhí)行。此時(shí)進(jìn)程的所有資源(除了CPU)都已分配好。
2.2.4.2阻塞狀態(tài)
進(jìn)程由于某些原因無法繼續(xù)執(zhí)行,此時(shí)進(jìn)程不再占用CPU,而是處于阻塞狀態(tài)。阻塞狀態(tài)的進(jìn)程會(huì)被移出CPU,直到它等待的條件滿足時(shí)才會(huì)變?yōu)榫途w狀態(tài)。
2.2.5進(jìn)程優(yōu)先級(jí)
進(jìn)程的優(yōu)先級(jí)是操作系統(tǒng)用來決定不同進(jìn)程執(zhí)行順序的重要標(biāo)準(zhǔn)。它指示了一個(gè)進(jìn)程相對(duì)于其他進(jìn)程的重要性,系統(tǒng)會(huì)優(yōu)先選擇優(yōu)先級(jí)高的進(jìn)程進(jìn)行執(zhí)行。但其實(shí)在真正執(zhí)行時(shí),優(yōu)先順序并不是定量的誰(shuí)一定先執(zhí)行誰(shuí)一定后執(zhí)行,而是一種定型的。
同樣,某個(gè)進(jìn)程的優(yōu)先級(jí)也可以在任務(wù)管理器進(jìn)行設(shè)置,但不知道為什么博主截不了圖,右鍵單機(jī)進(jìn)程就會(huì)有這個(gè)選項(xiàng)啦。
2.2.6進(jìn)程上下文
進(jìn)程的上下文指的是操作系統(tǒng)在切換進(jìn)程時(shí)需要保存和恢復(fù)的信息。每個(gè)進(jìn)程在運(yùn)行時(shí)都有自己的執(zhí)行狀態(tài),這些狀態(tài)決定了進(jìn)程如何繼續(xù)執(zhí)行。操作系統(tǒng)通過上下文切換在不同進(jìn)程之間進(jìn)行切換時(shí),保存并恢復(fù)這些信息。每次切換時(shí)必須保存和恢復(fù)這些信息,以確保每個(gè)進(jìn)程能夠從中斷的地方繼續(xù)執(zhí)行。
2.2.7進(jìn)程的記賬信息
統(tǒng)計(jì)每個(gè)進(jìn)程在CPU上執(zhí)行了多久。如果該進(jìn)程長(zhǎng)時(shí)間沒分配到CPU資源,就會(huì)給這個(gè)進(jìn)程傾斜一些CPU資源。
2.3CPU操作進(jìn)程的方法
現(xiàn)在的電腦的CPU一般都有四核,八核,十六核,但我們打開任務(wù)管理器發(fā)現(xiàn)有成百上千個(gè)進(jìn)程,那么電腦是如何同時(shí)操作這么多進(jìn)程呢。
答案就是CPU對(duì)進(jìn)程的操作的模式時(shí)分時(shí)復(fù)用:
分時(shí)復(fù)用:操作系統(tǒng)將CPU的時(shí)間分成若干個(gè)時(shí)間片,若一個(gè)進(jìn)程的時(shí)間片用完了,操作系統(tǒng)會(huì)把CPU控制權(quán)交給下一個(gè)進(jìn)程,保證多個(gè)進(jìn)程交替執(zhí)行。
現(xiàn)代CPU的執(zhí)行模式:
并行執(zhí)行:
多個(gè)核同時(shí)處理多個(gè)進(jìn)程
并發(fā)執(zhí)行:
單個(gè)核按照分時(shí)復(fù)用的原則處理多個(gè)進(jìn)程
2.4什么是線程
線程是操作系統(tǒng)調(diào)度的最小單位,是進(jìn)程(程序運(yùn)行的實(shí)例)中的一個(gè)執(zhí)行單元。一個(gè)進(jìn)程可以包含一個(gè)或多個(gè)線程,線程共享進(jìn)程的資源(如內(nèi)存、文件句柄),但每個(gè)線程都有自己的獨(dú)立執(zhí)行路徑、寄存器和??臻g。
當(dāng)然我們沒有辦法直接看到線程,得通過一些工具才能查看。
2.4.1進(jìn)程與線程
讓我們區(qū)分以下進(jìn)程和線程并分析以下他們之間的聯(lián)系:
- 進(jìn)程是線程的容器:一個(gè)進(jìn)程可以包含一個(gè)或多個(gè)線程。線程依賴進(jìn)程的存在,無法獨(dú)立于進(jìn)程運(yùn)行。
- 線程是進(jìn)程的組成部分:線程負(fù)責(zé)在進(jìn)程的上下文中執(zhí)行代碼,一個(gè)進(jìn)程至少有一個(gè)主線程,用于啟動(dòng)和管理程序的運(yùn)行。
- 進(jìn)程的生命周期包含線程的生命周期:當(dāng)一個(gè)進(jìn)程終止時(shí),其所有線程也會(huì)終止。線程的存在和生命周期完全依附于所在進(jìn)程。
2.4.2線程資源分布
類似于進(jìn)程,線程也有其對(duì)應(yīng)的屬性:
線程是進(jìn)程中的執(zhí)行單元,多個(gè)線程共享進(jìn)程的資源,如內(nèi)存空間、文件描述符等
但每個(gè)線程也有獨(dú)立的資源,包括棧、程序計(jì)數(shù)器和寄存器。操作系統(tǒng)通過合理的資源分配和調(diào)度機(jī)制,確保多線程程序高效、安全地執(zhí)行。
2.5簡(jiǎn)單實(shí)現(xiàn)線程
創(chuàng)建線程主要有倆種方式,一種是繼承Thread類,另一種是Runnable的接口,下文詳解。
2.5.1Thread類
操作步驟:
- 創(chuàng)建一個(gè)類并繼承
Thread類。 - 重寫
Thread類的run()方法,將線程執(zhí)行的具體任務(wù)寫在run()方法中。 - 創(chuàng)建線程對(duì)象并調(diào)用
start()方法啟動(dòng)線程。
static class myThread extends Thread{
@Override
public void run() {
System.out.println(("線程已執(zhí)行"));
}
}
public static void main(String[] args) {
myThread myThread1 = new myThread();
myThread1.run();
}
2.5.2Runnable接口
操作步驟:
- 創(chuàng)建一個(gè)類并實(shí)現(xiàn)
Runnable接口。 - 重寫
Runnable接口中的run()方法,將線程任務(wù)寫在該方法中。 - 創(chuàng)建一個(gè)
Thread對(duì)象,將實(shí)現(xiàn)了Runnable接口的實(shí)例作為參數(shù)傳遞給Thread構(gòu)造方法。 - 調(diào)用
Thread對(duì)象的start()方法啟動(dòng)線程。
static class myRunable implements Runnable{
@Override
public void run() {
while(true){
System.out.println("線程正在被執(zhí)行");
}
}
}
public static void main(String[] args) {
myRunable myRunable1 = new myRunable();
Thread thread = new Thread(myRunable1);
thread.start();
while(true){
System.out.println("主函數(shù)正在被執(zhí)行");
}
}
我們可以發(fā)現(xiàn)此時(shí)倆個(gè)線程,一個(gè)是主函數(shù)的,另一個(gè)是新創(chuàng)立的,在交替執(zhí)行。
2.5.3區(qū)分start和run
這里可能有細(xì)心的小伙伴們觀察出來,第一個(gè)我們用了run方法,第二個(gè)我們用了start方法,那么這倆種方法有什么區(qū)別嗎:
start()方法- 用于啟動(dòng)一個(gè)新的線程。
- 它會(huì)調(diào)用線程的底層實(shí)現(xiàn),告訴JVM創(chuàng)建一個(gè)新的線程。
- 然后,新線程會(huì)自動(dòng)調(diào)用
run()方法中定義的邏輯。 start()使線程并發(fā)執(zhí)行。
run()方法- 是線程要執(zhí)行的任務(wù)邏輯。
- 如果直接調(diào)用
run()方法,并不會(huì)創(chuàng)建新線程,而是由當(dāng)前線程執(zhí)行它。 - 相當(dāng)于普通的同步方法調(diào)用。
2.5.4查看線程
想要查看線程的話我們需要去JDK中去尋找一個(gè)叫做jconsole的exe文件:

連接后就能查看線程了:

3.小結(jié)
到此這篇關(guān)于Java進(jìn)程與線程及如何實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java進(jìn)程與線程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot添加jvm監(jiān)控實(shí)現(xiàn)數(shù)據(jù)可視化
這篇文章主要介紹了Springboot添加jvm監(jiān)控實(shí)現(xiàn)數(shù)據(jù)可視化,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
Spring如何基于Proxy及cglib實(shí)現(xiàn)動(dòng)態(tài)代理
這篇文章主要介紹了Spring如何基于Proxy及cglib實(shí)現(xiàn)動(dòng)態(tài)代理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06
javaweb啟動(dòng)時(shí)啟動(dòng)socket服務(wù)端代碼實(shí)現(xiàn)
這篇文章主要介紹了javaweb啟動(dòng)時(shí)啟動(dòng)socket服務(wù)端代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
詳解spring security之httpSecurity使用示例
這篇文章主要介紹了詳解spring security之httpSecurity使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
解決@PathVariable參數(shù)接收不完整的問題
這篇文章主要介紹了解決@PathVariable參數(shù)接收不完整的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
關(guān)于java.lang.IncompatibleClassChangeError錯(cuò)誤解決方案
最近開發(fā)中遇到類沖突報(bào)錯(cuò) java.lang.IncompatibleClassChangeError,所以下面這篇文章主要給大家介紹了關(guān)于java.lang.IncompatibleClassChangeError錯(cuò)誤的解決方案,需要的朋友可以參考下2024-02-02
Java按順序提取Word內(nèi)容的方法步驟(文本+數(shù)學(xué)公式)
本文分享通過Java POI庫(kù)解析Word試卷內(nèi)容,將數(shù)學(xué)公式轉(zhuǎn)換為L(zhǎng)aTeX并保持原有順序的方法,涉及XML文本提取、節(jié)點(diǎn)替換及文檔重構(gòu),解決公式位置錯(cuò)亂問題,實(shí)現(xiàn)非結(jié)構(gòu)化到結(jié)構(gòu)化轉(zhuǎn)換,需要的朋友可以參考下2025-09-09
java 通過聚合查詢實(shí)現(xiàn)elasticsearch的group by后的數(shù)量
這篇文章主要介紹了java 通過聚合查詢實(shí)現(xiàn)elasticsearch的group by后的數(shù)量,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Spring Boot企業(yè)常用的starter示例詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot企業(yè)常用starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12

