亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java之進程和線程的區別是什么

發布時間:2023-03-28 15:52:41 來源:億速云 閱讀:66 作者:iii 欄目:開發技術

這篇文章主要介紹“Java之進程和線程的區別是什么”,在日常操作中,相信很多人在Java之進程和線程的區別是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java之進程和線程的區別是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    進程和線程

    進程

    一個在內存中運行的應用程序。每個進程都有自己獨立的一塊內存空間,一個進程可以有多個線程,比如在Windows系統中,一個運行的xx.exe就是一個進程。

    Java之進程和線程的區別是什么

    線程

    進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程可以運行多個線程,多個線程可共享數據。

    與進程不同的是同類的多個線程共享進程的堆和方法區資源,但每個線程有自己的程序計數器、虛擬機棧和本地方法棧,所以系統在產生一個線程,或是在各個線程之間作切換工作時,負擔要比進程小得多,也正因為如此,線程也被稱為輕量級進程。

    Java 程序天生就是多線程程序,我們可以通過 JMX 來看一下一個普通的 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());
    		}
    	}
    }

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

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

    從上面的輸出內容可以看出:一個 Java 程序的運行是 main 線程和多個其他線程同時運行。

    進程與線程的區別總結

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

    根本區別:進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位

    資源開銷:每個進程都有獨立的代碼和數據空間(程序上下文),程序之間的切換會有較大的開銷;線程可以看做輕量級的進程,同一類線程共享代碼和數據空間,每個線程都有自己獨立的運行棧和程序計數器(PC),線程之間切換的開銷小。

    包含關系:如果一個進程內有多個線程,則執行過程不是一條線的,而是多條線(線程)共同完成的;線程是進程的一部分,所以線程也被稱為輕權進程或者輕量級進程。

    內存分配:同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的

    影響關系:一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。

    執行過程:每個獨立的進程有程序運行的入口、順序執行序列和程序出口。但是線程不能獨立執行,必須依存在應用程序中,由應用程序提供多個線程執行控制,兩者均可并發執行

    從 JVM 角度說進程和線程之間的關系(重要)

    圖解進程和線程的關系

    下圖是 Java 內存區域,通過下圖我們從 JVM 的角度來說一下線程和進程之間的關系。

    Java之進程和線程的區別是什么

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

    程序計數器為什么是私有的?

    程序計數器主要有下面兩個作用:

    1. 字節碼解釋器通過改變程序計數器來依次讀取指令,從而實現代碼的流程控制,如:順序執行、選擇、循環、異常處理。
    2. 在多線程的情況下,程序計數器用于記錄當前線程執行的位置,從而當線程被切換回來的時候能夠知道該線程上次運行到哪兒了。

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

    所以,程序計數器私有主要是為了線程切換后能恢復到正確的執行位置。

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

    • 虛擬機棧:每個 Java 方法在執行的同時會創建一個棧幀用于存儲局部變量表、操作數棧、常量池引用等信息。從方法調用直至執行完成的過程,就對應著一個棧幀在 Java 虛擬機棧中入棧和出棧的過程。

    • 本地方法棧:和虛擬機棧所發揮的作用非常相似,區別是: 虛擬機棧為虛擬機執行 Java 方法 (也就是字節碼)服務,而本地方法棧則為虛擬機使用到的 Native 方法服務。 在 HotSpot 虛擬機中和 Java 虛擬機棧合二為一。

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

    一句話簡單了解堆和方法區

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

    多進程和多線程區別

    多進程:操作系統中同時運行的多個程序

    多線程:在同一個進程中同時運行的多個任務

    舉個例子,多線程下載軟件,可以同時運行多個線程,但是通過程序運行的結果發現,每一次結果都不一致。 因為多線程存在一個特性:隨機性。造成的原因:CPU在瞬間不斷切換去處理各個線程而導致的,可以理解成多個線程在搶CPU資源。

    多線程提高CPU使用率

    Java之進程和線程的區別是什么

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

    Java中的多線程

    Java程序的進程里有幾個線程:主線程,垃圾回收線程(后臺線程)等

    在 Java 中,當我們啟動 main 函數時其實就是啟動了一個 JVM 的進程,而 main 函數所在的線程就是這個進程中的一個線程,也稱主線程。

    Java支持多線程,當Java程序執行main方法的時候,就是在執行一個名字叫做main的線程,可以在main方法執行時,開啟多個線程A,B,C,多個線程 main,A,B,C同時執行,相互搶奪CPU,Thread類是java.lang包下的一個常用類,每一個Thread類的對象,就代表一個處于某種狀態的線程。

    到此,關于“Java之進程和線程的區別是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    日土县| 石柱| 揭西县| 大港区| 牡丹江市| 青海省| 重庆市| 天柱县| 景德镇市| 罗甸县| 锡林郭勒盟| 乡城县| 定襄县| 秭归县| 古浪县| 进贤县| 兰溪市| 六安市| 黄山市| 商水县| 毕节市| 邓州市| 巴南区| 武夷山市| 高安市| 海阳市| 保德县| 六盘水市| 济宁市| 集安市| 酒泉市| 克什克腾旗| 北京市| 郁南县| 宽城| 泸溪县| 武强县| 永善县| 体育| 芜湖县| 镇江市|