摘要:進程一般由程序數(shù)據(jù)集進程控制塊三部分組成。線程概述線程的出現(xiàn)是為了降低上下文切換的消耗,提高系統(tǒng)的并發(fā)性。線程突破了一個進程只能干一件事的缺陷,使到進程內并發(fā)成為可能。進程與線程的關系進程是計算機中的程序關于某數(shù)據(jù)集合上的一次運行活動。
進程概述
進程:正在運行的程序,是系統(tǒng)進行資源分配和調用的獨立單位。
進程就是一個程序在一個數(shù)據(jù)集上的一次動態(tài)執(zhí)行過程。
進程一般由程序、數(shù)據(jù)集、進程控制塊三部分組成。
每一個進程都有它自己的內存空間和系統(tǒng)資源。
我們編寫的程序用來描述進程要完成哪些功能以及如何完成;
數(shù)據(jù)集則是程序在執(zhí)行過程中所需要使用的資源;
進程控制塊用來記錄進程的外部特征,描述進程的執(zhí)行變化過程,系統(tǒng)可以利用它來控制和管理進程,他是系統(tǒng)感知進程存在的唯一標識。
舉例說明進程:
(1)想象一位有一手好廚藝的計算機科學家正在為他的女兒烘焙生日蛋糕; (2)他有做生日蛋糕的食譜,廚房里有所需要的原料:面粉、雞蛋、糖等。 (3)在這個比喻中,做蛋糕的食譜就是程序; (4)計算機科學家就是處理器cpu; (5)而做蛋糕的各種原料就是輸入數(shù)據(jù)。 (6)進程就是廚師閱讀食譜、取來各種原料、以及烘焙蛋糕等一系列動作的總和。 (7)現(xiàn)在假設計算機科學家的兒子哭著跑來出來,說他的頭被一只蜜蜂蟄了; (8)計算機科學家就記錄下他照著食譜做到了哪兒了,也就是保存進程的當前狀態(tài); (9)然后拿出一本急救手冊,按照其中的指示處理蟄傷; (10)這時我們就看到處理器從一個進程切換到另一個高優(yōu)先級的進程; (11)每個進程擁有各自的程序(食譜和急救手冊); (12)當蜜蜂蟄傷被處理完成之后,這位計算機科學家又回來做蛋糕; (13)從他離開時的那一步繼續(xù)進行下去。線程概述
線程的出現(xiàn)是為了降低上下文切換的消耗,提高系統(tǒng)的并發(fā)性。
線程突破了一個進程只能干一件事的缺陷,使到進程內并發(fā)成為可能。
舉例說明線程:
(1)假設一個文本程序,需要接收鍵盤輸入,將內容顯示在屏幕上,還需要保存信息到硬盤中。 (2)若只有一個進程,勢必造成同一時間只能干一件事的尷尬,就是說當保存時,不能鍵盤輸入; (3)若有多個進程,每個進程負責一個任務; (4)進程A負責鍵盤輸入,進程B負責將內容顯示在屏幕上,進程C負責保存內容到硬盤中; (5)這里A、B、C間的協(xié)作涉及到了進程通信問題,而且它們有共同都需要的內容:文本內容; (6)不停的切換會造成性能上的損失。 (7)若有一種機制,可以使A、B、C可以共享資源; (8)這樣上下文切換所需要保存和恢復的內容就少了; (9)同時也可以減少通信所帶來的性能損耗。 (10)這種機制,就是線程。
線程也叫輕量級進程。
它是一個基本的cpu執(zhí)行單元,也是程序執(zhí)行過程中的最小單元。
由線程id、程序計數(shù)器、寄存器集合和堆棧共同組成
線程的引入減小了程序并發(fā)執(zhí)行時的開銷,提高了操作系統(tǒng)的并發(fā)性能。
線程沒有自己的系統(tǒng)資源。
進程與線程的關系進程是計算機中的程序關于某數(shù)據(jù)集合上的一次運行活動。
進程是系統(tǒng)進行資源分配和調度的基本單位,是操作系統(tǒng)結構的基礎
線程是進程的一個實體,是cpu調度和分派的基本單位
線程是比進程更小的能獨立運行的基本單位
進程與線程的關系:
(1)一個線程只能屬于一個進程,而一個進程可以有多個線程,但至少有一個線程 (2)資源分配給進程,同一進程的所有線程共享該進程的所有資源 (3)cpu分給線程,即真正在cpu上運行的是線程java程序運行原理
java命令會啟動java虛擬機,即啟動JVM,等于啟動了一個應用程序,也就是啟動了一個進程;
該進程會自動啟動一個主線程;
然后主線程去調用某個類的main方法。
所以main方法運行在主線程中,在此之前的所有程序都是單線程的
jvm啟動是多線程的:
(1)因為在jvm啟動的時候垃圾回收線程也要啟動,否則很容易會出現(xiàn)內存溢出; (2)現(xiàn)在的垃圾回收線程加上前面的主線程,最少啟動了兩個線程,所以,jvm的啟動是多線程的。涉及到多線程的內容分成幾部分:
扎好馬步:線程的狀態(tài)
內功心法:每個對象都有的方法(機制)
太祖長拳:基本線程類
九陰真經(jīng):高級多線程控制類
扎好馬步:線程的狀態(tài)(五種)New:新建狀態(tài),當線程對象創(chuàng)立后,即進入了新建狀態(tài),如:Thread t = new MyThread()
Runnable:就緒狀態(tài),當調用線程對象的start()方法(t.start()),線程就進入就緒狀態(tài)。處于就緒狀態(tài)的線程,只是說明此線程已經(jīng)做好了準備,隨時等待cpu調度執(zhí)行,并不是說執(zhí)行了t.start()此線程立即就會執(zhí)行
Running:運行狀態(tài),當cpu開始調度處于就緒狀態(tài)的線程時,此時線程才得以真正執(zhí)行,即進入到運行狀態(tài)。
Blocked:阻塞狀態(tài),處于運行狀態(tài)中的線程由于某種原因,暫時放棄對cpu的使用權,停止執(zhí)行,此時進入阻塞狀態(tài),直到其進入到就緒狀態(tài),才有機會再次被cpu調用以進入到運行狀態(tài)
Dead:死亡狀態(tài),線程執(zhí)行完了或者因異常退出了run()方法,該線程結束生命周期
注意:
(1)就緒狀態(tài)是進入到運行狀態(tài)的唯一入口 (2)線程想要進入到運行狀態(tài)執(zhí)行,首先必須處于就緒狀態(tài)中 (3)根據(jù)阻塞產(chǎn)生的原因,阻塞狀態(tài)又可以分為三種: 【1】等待阻塞:運行狀態(tài)中的線程執(zhí)行wait()方法,使本線程進入到等待阻塞狀態(tài) 【2】同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其他線程占用),它會進入同步阻塞狀態(tài) 【3】其他阻塞:通過調用線程的sleep()或join()或發(fā)出了I/O請求時,線程會進入到阻塞狀態(tài)。當sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態(tài)內功心法:每個對象都有的方法
synchronized、wait、notify是任何對象都具有的同步工具
monitor:
(1)是應用于同步問題的人工線程調度工具 (2)java的每個對象都有一個監(jiān)視器,來監(jiān)測并發(fā)代碼的重入。 (3)在非多線程編碼時該監(jiān)視器不發(fā)揮作用,反之如果在synchronized范圍內,監(jiān)視器發(fā)揮作用
wait/notify:二者都必須存在于synchronized塊中
并且這三個關鍵字針對的是同一個監(jiān)視器,這意味著wait之后,其他線程可以進入同步塊執(zhí)行
太祖長拳:基本線程類Thread類
Runnable類
Callable類
九陰真經(jīng):高級多線程控制類
ThreadLocal類:
(1)用于保存線程的對立變量 (2)當使用ThreadLocal維護變量時,ThreadLocal為每個使用該變量的線程提供獨立的變量副本,所以每一個線程都可以獨立的改變自己的副本,而不會影響其他線程所對應的副本。 (3)常用與用戶登陸控制,如記錄session信息。
原子類(AtomicInteger/AtomicBoolean)
Lock類:ReentrantLock/ReentrantReadWriteLock.ReadLock/ReentrantReadWriteLock.WriteLock
參考鏈接https://www.cnblogs.com/wxd01...
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77155.html
摘要:哪吒社區(qū)技能樹打卡打卡貼函數(shù)式接口簡介領域優(yōu)質創(chuàng)作者哪吒公眾號作者架構師奮斗者掃描主頁左側二維碼,加入群聊,一起學習一起進步歡迎點贊收藏留言前情提要無意間聽到領導們的談話,現(xiàn)在公司的現(xiàn)狀是碼農(nóng)太多,但能獨立帶隊的人太少,簡而言之,不缺干 ? 哪吒社區(qū)Java技能樹打卡?【打卡貼 day2...
摘要:整個包,按照功能可以大致劃分如下鎖框架原子類框架同步器框架集合框架執(zhí)行器框架本系列將按上述順序分析,分析所基于的源碼為。后,根據(jù)一系列常見的多線程設計模式,設計了并發(fā)包,其中包下提供了一系列基礎的鎖工具,用以對等進行補充增強。 showImg(https://segmentfault.com/img/remote/1460000016012623); 本文首發(fā)于一世流云專欄:https...
摘要:編譯完成后,如果沒有報錯,那么通過命令對字節(jié)碼文件進行解釋運行,執(zhí)行時不需要添加后綴總結說白了,整個程序對編寫運行有三步編寫為后綴對程序文件通過程序文件進行編譯生成文件文件名解釋運行寫代碼編譯解釋運行 前言 最近開始學習下java,畢竟web開發(fā)還是java比較完善功能也較php更加強大。學習資料參考:https://github.com/DuGuQiuBai... 此章主要記錄下...
摘要:程序正常運行,輸出了預期容量的大小這是正常運行結果,未發(fā)生多線程安全問題,但這是不確定性的,不是每次都會達到正常預期的。另外,像等都有類似多線程安全問題,在多線程并發(fā)環(huán)境下避免使用這種集合。 這個問題是 Java 程序員面試經(jīng)常會遇到的吧。 工作一兩年的應該都知道 ArrayList 是線程不安全的,要使用線程安全的就使用 Vector,這也是各種 Java 面試寶典里面所提及的,可能...
閱讀 2167·2023-04-25 20:45
閱讀 1080·2021-09-22 15:13
閱讀 3647·2021-09-04 16:48
閱讀 2583·2019-08-30 15:53
閱讀 933·2019-08-30 15:44
閱讀 946·2019-08-30 15:43
閱讀 1008·2019-08-29 16:33
閱讀 3437·2019-08-29 13:08