欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java之進(jìn)程和線程的區(qū)別

 更新時(shí)間:2023年03月28日 14:17:45   作者:ThinkWon  
這篇文章主要介紹了進(jìn)程與線程的區(qū)別,線程具有許多傳統(tǒng)進(jìn)程所具有的特征,而把傳統(tǒng)的進(jìn)程稱為重型進(jìn)程(Heavy—Weight Process),它相當(dāng)于只有一個(gè)線程的任務(wù),有感興趣的小伙伴可以參考閱讀本文

進(jìn)程和線程

進(jìn)程

一個(gè)在內(nèi)存中運(yùn)行的應(yīng)用程序。每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間,一個(gè)進(jìn)程可以有多個(gè)線程,比如在Windows系統(tǒng)中,一個(gè)運(yùn)行的xx.exe就是一個(gè)進(jìn)程。

線程

進(jìn)程中的一個(gè)執(zhí)行任務(wù)(控制單元),負(fù)責(zé)當(dāng)前進(jìn)程中程序的執(zhí)行。一個(gè)進(jìn)程至少有一個(gè)線程,一個(gè)進(jìn)程可以運(yùn)行多個(gè)線程,多個(gè)線程可共享數(shù)據(jù)。

與進(jìn)程不同的是同類的多個(gè)線程共享進(jìn)程的堆和方法區(qū)資源,但每個(gè)線程有自己的程序計(jì)數(shù)器、虛擬機(jī)棧和本地方法棧,所以系統(tǒng)在產(chǎn)生一個(gè)線程,或是在各個(gè)線程之間作切換工作時(shí),負(fù)擔(dān)要比進(jìn)程小得多,也正因?yàn)槿绱?,線程也被稱為輕量級(jí)進(jìn)程。

Java 程序天生就是多線程程序,我們可以通過(guò) JMX 來(lái)看一下一個(gè)普通的 Java 程序有哪些線程,代碼如下。

public class MultiThread {
	public static void main(String[] args) {
		// 獲取 Java 線程管理 MXBean
		ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
		// 不需要獲取同步的 monitor 和 synchronizer 信息,僅獲取線程和線程堆棧信息
		ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
		// 遍歷線程信息,僅打印線程 ID 和線程名稱信息
		for (ThreadInfo threadInfo : threadInfos) {
			System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
		}
	}
}

上述程序輸出如下(輸出內(nèi)容可能不同,不用太糾結(jié)下面每個(gè)線程的作用,只用知道 main 線程執(zhí)行 main 方法即可):

[6] Monitor Ctrl-Break //監(jiān)聽(tīng)線程轉(zhuǎn)儲(chǔ)或“線程堆棧跟蹤”的線程
[5] Attach Listener //負(fù)責(zé)接收到外部的命令,而對(duì)該命令進(jìn)行執(zhí)行的并且把結(jié)果返回給發(fā)送者
[4] Signal Dispatcher // 分發(fā)處理給 JVM 信號(hào)的線程
[3] Finalizer //在垃圾收集前,調(diào)用對(duì)象 finalize 方法的線程
[2] Reference Handler //用于處理引用對(duì)象本身(軟引用、弱引用、虛引用)的垃圾回收的線程
[1] main //main 線程,程序入口

從上面的輸出內(nèi)容可以看出:一個(gè) Java 程序的運(yùn)行是 main 線程和多個(gè)其他線程同時(shí)運(yùn)行。

進(jìn)程與線程的區(qū)別總結(jié)

線程具有許多傳統(tǒng)進(jìn)程所具有的特征,故又稱為輕型進(jìn)程(Light—Weight Process)或進(jìn)程元;而把傳統(tǒng)的進(jìn)程稱為重型進(jìn)程(Heavy—Weight Process),它相當(dāng)于只有一個(gè)線程的任務(wù)。在引入了線程的操作系統(tǒng)中,通常一個(gè)進(jìn)程都有若干個(gè)線程,至少包含一個(gè)線程。

根本區(qū)別:進(jìn)程是操作系統(tǒng)資源分配的基本單位,而線程是處理器任務(wù)調(diào)度和執(zhí)行的基本單位

資源開(kāi)銷:每個(gè)進(jìn)程都有獨(dú)立的代碼和數(shù)據(jù)空間(程序上下文),程序之間的切換會(huì)有較大的開(kāi)銷;線程可以看做輕量級(jí)的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個(gè)線程都有自己獨(dú)立的運(yùn)行棧和程序計(jì)數(shù)器(PC),線程之間切換的開(kāi)銷小。

包含關(guān)系:如果一個(gè)進(jìn)程內(nèi)有多個(gè)線程,則執(zhí)行過(guò)程不是一條線的,而是多條線(線程)共同完成的;線程是進(jìn)程的一部分,所以線程也被稱為輕權(quán)進(jìn)程或者輕量級(jí)進(jìn)程。

內(nèi)存分配:同一進(jìn)程的線程共享本進(jìn)程的地址空間和資源,而進(jìn)程之間的地址空間和資源是相互獨(dú)立的

影響關(guān)系:一個(gè)進(jìn)程崩潰后,在保護(hù)模式下不會(huì)對(duì)其他進(jìn)程產(chǎn)生影響,但是一個(gè)線程崩潰整個(gè)進(jìn)程都死掉。所以多進(jìn)程要比多線程健壯。

執(zhí)行過(guò)程:每個(gè)獨(dú)立的進(jìn)程有程序運(yùn)行的入口、順序執(zhí)行序列和程序出口。但是線程不能獨(dú)立執(zhí)行,必須依存在應(yīng)用程序中,由應(yīng)用程序提供多個(gè)線程執(zhí)行控制,兩者均可并發(fā)執(zhí)行

從 JVM 角度說(shuō)進(jìn)程和線程之間的關(guān)系(重要)

圖解進(jìn)程和線程的關(guān)系

下圖是 Java 內(nèi)存區(qū)域,通過(guò)下圖我們從 JVM 的角度來(lái)說(shuō)一下線程和進(jìn)程之間的關(guān)系。

從上圖可以看出:一個(gè)進(jìn)程中可以有多個(gè)線程,多個(gè)線程共享進(jìn)程的方法區(qū) (JDK1.8 之后的元空間)資源,但是每個(gè)線程有自己的程序計(jì)數(shù)器、虛擬機(jī)棧 和 本地方法棧。

程序計(jì)數(shù)器為什么是私有的?

程序計(jì)數(shù)器主要有下面兩個(gè)作用:

1. 字節(jié)碼解釋器通過(guò)改變程序計(jì)數(shù)器來(lái)依次讀取指令,從而實(shí)現(xiàn)代碼的流程控制,如:順序執(zhí)行、選擇、循環(huán)、異常處理。
2. 在多線程的情況下,程序計(jì)數(shù)器用于記錄當(dāng)前線程執(zhí)行的位置,從而當(dāng)線程被切換回來(lái)的時(shí)候能夠知道該線程上次運(yùn)行到哪兒了。

需要注意的是,如果執(zhí)行的是 native 方法,那么程序計(jì)數(shù)器記錄的是 undefined 地址,只有執(zhí)行的是 Java 代碼時(shí)程序計(jì)數(shù)器記錄的才是下一條指令的地址。

所以,程序計(jì)數(shù)器私有主要是為了線程切換后能恢復(fù)到正確的執(zhí)行位置。

虛擬機(jī)棧和本地方法棧為什么是私有的?

  • 虛擬機(jī)棧:每個(gè) Java 方法在執(zhí)行的同時(shí)會(huì)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表、操作數(shù)棧、常量池引用等信息。從方法調(diào)用直至執(zhí)行完成的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在 Java 虛擬機(jī)棧中入棧和出棧的過(guò)程。
  • 本地方法棧:和虛擬機(jī)棧所發(fā)揮的作用非常相似,區(qū)別是: 虛擬機(jī)棧為虛擬機(jī)執(zhí)行 Java 方法 (也就是字節(jié)碼)服務(wù),而本地方法棧則為虛擬機(jī)使用到的 Native 方法服務(wù)。 在 HotSpot 虛擬機(jī)中和 Java 虛擬機(jī)棧合二為一。

所以,為了保證線程中的局部變量不被別的線程訪問(wèn)到,虛擬機(jī)棧和本地方法棧是線程私有的。

一句話簡(jiǎn)單了解堆和方法區(qū)

堆和方法區(qū)是所有線程共享的資源,其中堆是進(jìn)程中最大的一塊內(nèi)存,主要用于存放新創(chuàng)建的對(duì)象 (所有對(duì)象都在這里分配內(nèi)存),方法區(qū)主要用于存放已被加載的類信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。

多進(jìn)程和多線程區(qū)別

多進(jìn)程:操作系統(tǒng)中同時(shí)運(yùn)行的多個(gè)程序

多線程:在同一個(gè)進(jìn)程中同時(shí)運(yùn)行的多個(gè)任務(wù)

舉個(gè)例子,多線程下載軟件,可以同時(shí)運(yùn)行多個(gè)線程,但是通過(guò)程序運(yùn)行的結(jié)果發(fā)現(xiàn),每一次結(jié)果都不一致。 因?yàn)槎嗑€程存在一個(gè)特性:隨機(jī)性。造成的原因:CPU在瞬間不斷切換去處理各個(gè)線程而導(dǎo)致的,可以理解成多個(gè)線程在搶CPU資源。

多線程提高CPU使用率

多線程并不能提高運(yùn)行速度,但可以提高運(yùn)行效率,讓CPU的使用率更高。但是如果多線程有安全問(wèn)題或出現(xiàn)頻繁的上下文切換時(shí),運(yùn)算速度可能反而更低。

Java中的多線程

Java程序的進(jìn)程里有幾個(gè)線程:主線程,垃圾回收線程(后臺(tái)線程)等

在 Java 中,當(dāng)我們啟動(dòng) main 函數(shù)時(shí)其實(shí)就是啟動(dòng)了一個(gè) JVM 的進(jìn)程,而 main 函數(shù)所在的線程就是這個(gè)進(jìn)程中的一個(gè)線程,也稱主線程。

Java支持多線程,當(dāng)Java程序執(zhí)行main方法的時(shí)候,就是在執(zhí)行一個(gè)名字叫做main的線程,可以在main方法執(zhí)行時(shí),開(kāi)啟多個(gè)線程A,B,C,多個(gè)線程 main,A,B,C同時(shí)執(zhí)行,相互搶奪CPU,Thread類是java.lang包下的一個(gè)常用類,每一個(gè)Thread類的對(duì)象,就代表一個(gè)處于某種狀態(tài)的線程

到此這篇關(guān)于Java之進(jìn)程和線程的區(qū)別的文章就介紹到這了,更多相關(guān)進(jìn)程與線程的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • springboot框架阿里開(kāi)源低代碼工具LowCodeEngine

    springboot框架阿里開(kāi)源低代碼工具LowCodeEngine

    這篇文章主要為大家介紹了springboot框架阿里開(kāi)源低代碼LowCodeEngine工具使用詳解有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java項(xiàng)目的目錄結(jié)構(gòu)詳解

    Java項(xiàng)目的目錄結(jié)構(gòu)詳解

    本文主要介紹了Java項(xiàng)目的目錄結(jié)構(gòu)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java實(shí)現(xiàn)按行分割大文件

    Java實(shí)現(xiàn)按行分割大文件

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)按行分割大文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • java進(jìn)階解析Springboot上傳excel存入數(shù)據(jù)庫(kù)步驟

    java進(jìn)階解析Springboot上傳excel存入數(shù)據(jù)庫(kù)步驟

    項(xiàng)目需要,寫(xiě)了一個(gè),批量導(dǎo)入的接口。因?yàn)樾枰褂胑xcel去批量導(dǎo)入數(shù)據(jù),所以寫(xiě)了一個(gè)例子,經(jīng)過(guò)測(cè)試已經(jīng)可以用于實(shí)際開(kāi)發(fā),這里記錄一下
    2021-09-09
  • eclipse下配置Spring環(huán)境的方法步驟

    eclipse下配置Spring環(huán)境的方法步驟

    這篇文章主要介紹了eclipse下配置Spring環(huán)境的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java BIO,NIO,AIO總結(jié)

    Java BIO,NIO,AIO總結(jié)

    這篇文章主要介紹了Java BIO,NIO,AIO的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-09-09
  • RabbitMQ消息拒絕如何解決

    RabbitMQ消息拒絕如何解決

    這篇文章主要介紹了RabbitMQ消息拒絕如何解決問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Spring-data-redis操作redis cluster的示例代碼

    Spring-data-redis操作redis cluster的示例代碼

    這篇文章主要介紹了Spring-data-redis操作redis cluster的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 在SpringBoot 中從application.yml中獲取自定義常量方式

    在SpringBoot 中從application.yml中獲取自定義常量方式

    這篇文章主要介紹了在SpringBoot 中從application.yml中獲取自定義常量方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-04-04
  • spring配置掃描多個(gè)包問(wèn)題解析

    spring配置掃描多個(gè)包問(wèn)題解析

    這篇文章主要介紹了spring配置掃描多個(gè)包問(wèn)題解析,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10

最新評(píng)論