最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java進(jìn)程與線程介紹及如何實(shí)現(xiàn)

 更新時(shí)間:2025年10月19日 12:59:13   作者:愛吃烤雞翅的酸菜魚  
進(jìn)程(Process)是計(jì)算機(jī)中執(zhí)行的程序的實(shí)例,它是操作系統(tǒng)分配資源和調(diào)度的基本單位,本文給大家介紹Java進(jìn)程與線程的相關(guā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ù)可視化

    這篇文章主要介紹了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)代理

    這篇文章主要介紹了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)

    這篇文章主要介紹了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使用示例

    這篇文章主要介紹了詳解spring security之httpSecurity使用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 解決@PathVariable參數(shù)接收不完整的問題

    解決@PathVariable參數(shù)接收不完整的問題

    這篇文章主要介紹了解決@PathVariable參數(shù)接收不完整的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 關(guān)于java.lang.IncompatibleClassChangeError錯(cuò)誤解決方案

    關(guān)于java.lang.IncompatibleClassChangeError錯(cuò)誤解決方案

    最近開發(fā)中遇到類沖突報(bào)錯(cuò) java.lang.IncompatibleClassChangeError,所以下面這篇文章主要給大家介紹了關(guān)于java.lang.IncompatibleClassChangeError錯(cuò)誤的解決方案,需要的朋友可以參考下
    2024-02-02
  • Java?將Excel轉(zhuǎn)為UOS的操作方法

    Java?將Excel轉(zhuǎn)為UOS的操作方法

    以.uos為后綴的文件,表示Uniform?Office?Spreadsheet文件,是一種國(guó)產(chǎn)的辦公文件格式,該格式以統(tǒng)一辦公格式(UOF)創(chuàng)建,使用XML和壓縮保存電子表格,這篇文章主要介紹了Java?將Excel轉(zhuǎn)為UOS,需要的朋友可以參考下
    2022-09-09
  • Java按順序提取Word內(nèi)容的方法步驟(文本+數(shù)學(xué)公式)

    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ù)量

    這篇文章主要介紹了java 通過聚合查詢實(shí)現(xiàn)elasticsearch的group by后的數(shù)量,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • Spring Boot企業(yè)常用的starter示例詳解

    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

最新評(píng)論

汝城县| 游戏| 沅江市| 正镶白旗| 辽阳市| 亚东县| 昌乐县| 将乐县| 和政县| 宝坻区| 汕头市| 赤壁市| 留坝县| 新巴尔虎右旗| 虹口区| 太康县| 鄂温| 泰顺县| 长兴县| 大宁县| 淮安市| 枣阳市| 凤阳县| 兴化市| 河东区| 东丽区| 福贡县| 安化县| 呼伦贝尔市| 余江县| 潢川县| 温宿县| 乐陵市| 安泽县| 白玉县| 安阳市| 安西县| 龙岩市| 彭州市| 新干县| 龙川县|