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