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