国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java系列】詳解多線程(一)

這篇具有很好參考價(jià)值的文章主要介紹了【Java系列】詳解多線程(一)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

個(gè)人主頁(yè):兜里有顆棉花糖
歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng)
收錄于專欄【Java系列專欄】【JaveEE學(xué)習(xí)專欄】
本專欄旨在分享學(xué)習(xí)Java的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評(píng)論區(qū)交流討論??

一、背景引入

在引入多線程之前,我們先來(lái)看一下進(jìn)程是為了干什么的,一句話總結(jié)就是:滿足"并發(fā)編程"這樣的需求。

早些時(shí)候,CPU都是單核心的CPU,但是隨著技術(shù)工藝變得越來(lái)越強(qiáng),單核心CPU的性能的確是越來(lái)越強(qiáng)的,但是單核心CPU技術(shù)工藝研發(fā)到一定程度后就會(huì)遇到瓶頸,從而導(dǎo)致單核心CPU的研發(fā)變得非常緩慢。于是就就逐漸向多核心CPU的方向進(jìn)行發(fā)展研究。

好了,既然CPU逐漸變成了多核心,那么應(yīng)用程序也應(yīng)該做出相應(yīng)的調(diào)整來(lái)把多核心的CPU給利用起來(lái)(意思就是僅僅由硬件上的支撐是不夠的,我們還要由軟件上的配合),以免造成一核有難,多核圍觀的場(chǎng)景。

另外,早期的系統(tǒng)一般是單任務(wù)系統(tǒng),即在同一時(shí)刻只能使用一個(gè)程序,而無(wú)法在同一時(shí)刻內(nèi)使用多個(gè)程序,完成多個(gè)任務(wù)。而要完成多個(gè)任務(wù)的話,進(jìn)程就顯得特別關(guān)鍵。

二、線程的引入

多進(jìn)程能夠很好的實(shí)現(xiàn)并發(fā)編程的效果,但還由一個(gè)缺點(diǎn)就是進(jìn)程太重,即消耗資源更多,速度更慢。如果進(jìn)程的創(chuàng)建和銷毀比較少的話那還勉強(qiáng)可以,但是如果進(jìn)程的創(chuàng)建和銷毀非常頻繁的話,此時(shí)就會(huì)產(chǎn)生非常多的開(kāi)銷。開(kāi)銷大主要體現(xiàn)在需要給進(jìn)程分配資源,而給進(jìn)程分配資源的這一過(guò)程也是需要很多時(shí)間成本的。

于是就有人提出這樣一個(gè)解決方案:即在創(chuàng)建進(jìn)程的過(guò)程中,只分配簡(jiǎn)單的PCB(進(jìn)程控制塊),而不去分配后續(xù)需要的內(nèi)存硬盤資源,即把分配資源的時(shí)間省去,這樣既可以完成多并發(fā)編程的任務(wù)又能夠提升進(jìn)程創(chuàng)建銷毀的速度。

這樣一種只分配簡(jiǎn)單的PCB而不去分配后續(xù)需要的內(nèi)存硬盤資源的這樣一種方式稱為輕量級(jí)進(jìn)程,也叫做線程(thread)。所以簡(jiǎn)單來(lái)說(shuō)線程就是只分配PCB,但不分配后續(xù)需要的內(nèi)存硬盤資源。

但是線程總歸是要完成任務(wù)的,如果不去分配后續(xù)需要的內(nèi)存硬盤資源顯然是不可以的,于是就有人想出來(lái)這樣的一個(gè)辦法:在創(chuàng)建進(jìn)程的時(shí)候,先把后續(xù)需要的內(nèi)存資源分配好;后續(xù)創(chuàng)建線程的時(shí)候讓線程在進(jìn)程內(nèi)部直接復(fù)用先前進(jìn)程分配創(chuàng)建好的內(nèi)存資源(線程和進(jìn)程直接的關(guān)系:進(jìn)程包含線程)

另外,一個(gè)進(jìn)程至少要包含一個(gè)線程,最初進(jìn)程創(chuàng)建出來(lái)的時(shí)候,我們可以將這個(gè)進(jìn)程視為一個(gè)只包含一個(gè)線程的進(jìn)程(注意此時(shí)創(chuàng)建進(jìn)程的過(guò)程是需要分配資源的,同時(shí)第一個(gè)線程的創(chuàng)建開(kāi)銷是可能是比較大的),我們后續(xù)再次創(chuàng)建線程的時(shí)候就不需要分配資源了,也就省去了分配資源的過(guò)程,因?yàn)橘Y源已經(jīng)是有了的。

小總結(jié)

好了,我們已經(jīng)知道多進(jìn)程已經(jīng)可以完成并發(fā)編程的任務(wù)了,但是由于進(jìn)程本身有些重,重就體現(xiàn)在進(jìn)程的創(chuàng)建和銷毀所需要的內(nèi)存硬盤資源開(kāi)銷有些大。

所以就引入了線程(也稱為輕量級(jí)進(jìn)程)來(lái)更高的解決上述的問(wèn)題。進(jìn)程中的多個(gè)線程公共復(fù)用了進(jìn)程中的各種內(nèi)存硬盤等資源,同時(shí)這些進(jìn)程可以各自獨(dú)立的在CPU中進(jìn)行調(diào)度。所以這樣的話線程既可以完成并發(fā)編程的效果,又可以以輕量級(jí)的方式來(lái)完成各種任務(wù)。

另外,這里補(bǔ)充一個(gè)點(diǎn),進(jìn)程和線程是兩個(gè)不同的概念,在Linux中復(fù)用了PCB這個(gè)結(jié)構(gòu)體來(lái)描述線程,而在Windows中,描述進(jìn)程和線程是不同的結(jié)構(gòu)體。所以在Windows中,為了更好的描述進(jìn)程,有時(shí)一個(gè)PCB對(duì)應(yīng)一個(gè)線程,多個(gè)PCB對(duì)應(yīng)一個(gè)進(jìn)程(即可能是多一個(gè)PCB來(lái)描述一個(gè)進(jìn)程,一個(gè)PCB來(lái)描述一個(gè)線程)。

CPU的內(nèi)存指針和文件描述符表文件描述符表這兩個(gè)字段內(nèi)容在同一個(gè)進(jìn)程是一樣的,但是上下文信息、狀態(tài)、優(yōu)先級(jí)、記賬信息......等支持調(diào)度的屬性,這些PCB就不一樣了(意思就是每個(gè)線程獨(dú)立去CPU上進(jìn)行調(diào)度,每個(gè)線程的上下文、狀態(tài)、優(yōu)先級(jí)、記賬信息等支持調(diào)度的屬性都有自已獨(dú)立的一份)。

線程的引入的確能夠提高任務(wù)執(zhí)行的速度,同時(shí)隨著線程數(shù)量的增多任務(wù)執(zhí)行完成的速度當(dāng)然也會(huì)增快,但是線程的數(shù)量不能是無(wú)限制提高的(CPU的核心數(shù)的數(shù)量是有限的。),同時(shí)線程數(shù)量也不是越多越好,因?yàn)榫€程調(diào)度的開(kāi)銷有時(shí)會(huì)拖慢整個(gè)程序的效率。

兩句話總結(jié):

1.進(jìn)程是操作系統(tǒng)中進(jìn)行資源分配的基本單位。
2.線程是操作系統(tǒng)中進(jìn)程調(diào)度執(zhí)行的基本單位。

三、進(jìn)程和線程的關(guān)系(面試題)

1.進(jìn)程包含線程,都是實(shí)現(xiàn)并發(fā)編程的一種方式,但是由于多進(jìn)程的創(chuàng)建和銷毀的效率并沒(méi)有那么高,且線程比進(jìn)程更加輕量。所以就引入了多線程的概念。

2.進(jìn)程是系統(tǒng)分派資源的基本單位;線程是是系統(tǒng)調(diào)度的基本單位,創(chuàng)建進(jìn)程的時(shí)候已經(jīng)把分配資源(這里的資源主要指的是虛擬地址空間和符表)的工作做了,后續(xù)創(chuàng)建進(jìn)程的時(shí)候直接復(fù)用之前的資源即可。

3.每個(gè)進(jìn)程都有自己獨(dú)立的地址空間,彼此直接不會(huì)相會(huì)影響到,從而保證了每個(gè)進(jìn)程的獨(dú)立性,保證了數(shù)據(jù)穩(wěn)定性。
需要注意的是,如果多個(gè)組線程程共用了一份地址空間的話,一旦某個(gè)線程拋出異常的話,就可能會(huì)導(dǎo)致一整個(gè)進(jìn)程結(jié)束(所以多個(gè)線程之間是很容易相互影響的。 )。

四、第一個(gè)多線程程序

線程本身是操作系統(tǒng)的概念,而操作系統(tǒng)又提供了API來(lái)供我們使用線程,來(lái)完成多線程編程(在Linux中稱為pthread庫(kù),通過(guò)這個(gè)庫(kù)我們就可以完成多線程編程)。

而在Java中,把操作系統(tǒng)中的API進(jìn)程分裝,即提供了Thread類來(lái)幫助哦我們來(lái)完成多線程編程。

Java標(biāo)準(zhǔn)庫(kù)中的Thread類來(lái)自于java.lang這個(gè)包,而Java.lang這個(gè)包不需要我們手動(dòng)的import。

好了,光說(shuō)不練是不行的,接下來(lái)我們就來(lái)看一下我們的第一個(gè)線程程序,請(qǐng)看下圖:

package thread;

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Hello,world!");
    }
}

public class Demo01 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
    }
}

現(xiàn)在我們來(lái)解釋上述的線程程序,上述代碼的MyThread類中的run()方法是重寫的Thread父類中的run()方法,這個(gè)run()方法相當(dāng)于線程程序的入口,線程程序跑起來(lái)之后具體要干什么事情,都是通過(guò)這個(gè)run()方法來(lái)進(jìn)行描述的。

myThread.start()這個(gè)操作就是在創(chuàng)建一個(gè)線程(即在底層調(diào)用操作系統(tǒng)提供的創(chuàng)建線程的API,同時(shí)在操作系統(tǒng)內(nèi)核中創(chuàng)建出其對(duì)應(yīng)的PCB結(jié)構(gòu),并將其加入到鏈表中)。此時(shí)這個(gè)新創(chuàng)建出來(lái)的線程就會(huì)參與到cpu的調(diào)度中,接下來(lái)線程要執(zhí)行的任務(wù),就是run()方法中的內(nèi)容。

接下來(lái)我如果注釋掉myThread.start();,即直接執(zhí)行MyThread類中的run()方法,請(qǐng)看下圖:
【Java系列】詳解多線程(一),Java系列,JavaEE學(xué)習(xí)專欄,java,開(kāi)發(fā)語(yǔ)言,java-ee
我們來(lái)解釋上述程序,我們前面已經(jīng)知道,start方法會(huì)去調(diào)用操作系統(tǒng)提供的創(chuàng)建線程的API,同時(shí)在操作系統(tǒng)內(nèi)核中創(chuàng)建出其所對(duì)應(yīng)的PCB,此時(shí)這個(gè)新創(chuàng)建出來(lái)的線程就會(huì)參與cpu調(diào)度。
而我們直接運(yùn)行run方法的話,此時(shí)并沒(méi)有調(diào)用操作系統(tǒng)提供的創(chuàng)建線程的API,也就沒(méi)有創(chuàng)建出新的進(jìn)程。
當(dāng)整個(gè)程序開(kāi)始運(yùn)行的時(shí)候,此時(shí)會(huì)先創(chuàng)建出來(lái)一個(gè)java進(jìn)程,這個(gè)java進(jìn)程中至少包含一個(gè)進(jìn)程,稱為主進(jìn)程,這個(gè)主進(jìn)程是負(fù)責(zé)執(zhí)行main()方法的線程。每一個(gè)線程都能夠被獨(dú)立的進(jìn)行調(diào)用和執(zhí)行。

每個(gè)線程都能夠被獨(dú)立的進(jìn)行調(diào)用執(zhí)行

每個(gè)線程都能夠被獨(dú)立的進(jìn)行調(diào)用執(zhí)行,現(xiàn)在我們來(lái)寫一個(gè)程序來(lái)體現(xiàn)這句話。請(qǐng)看:

【Java系列】詳解多線程(一),Java系列,JavaEE學(xué)習(xí)專欄,java,開(kāi)發(fā)語(yǔ)言,java-ee
運(yùn)行結(jié)果如下(由于程序是一個(gè)死循環(huán),所以這里只是截取了部分的程序運(yùn)行結(jié)果),如下圖:
【Java系列】詳解多線程(一),Java系列,JavaEE學(xué)習(xí)專欄,java,開(kāi)發(fā)語(yǔ)言,java-ee
我們可以看到程序一會(huì)執(zhí)行Hello,Linux!一會(huì)執(zhí)行Hello,world!
解釋:start()是新線程執(zhí)行的入口,而主線程和新線程是并發(fā)執(zhí)行的一個(gè)關(guān)系。先新創(chuàng)建出來(lái)的線程創(chuàng)建出來(lái)之后會(huì)執(zhí)行run()方法中的代碼,而main()方法則是繼續(xù)往后執(zhí)行。所以最終呈現(xiàn)出來(lái)的程序運(yùn)行效果就是一會(huì)執(zhí)行Hello,Linux!,一會(huì)執(zhí)行Hello,world!。

現(xiàn)在我們?cè)趤?lái)看一段程序,請(qǐng)看下圖:
【Java系列】詳解多線程(一),Java系列,JavaEE學(xué)習(xí)專欄,java,開(kāi)發(fā)語(yǔ)言,java-ee
我們可以看到上述代碼把myThread.start()注釋掉了,相當(dāng)于我們并沒(méi)有創(chuàng)建線程,那么此時(shí)的話只有整個(gè)程序只有主線程這一個(gè)線程了。
分析到這里我們已經(jīng)知道整個(gè)程序只有線程(也就是主線程),那么執(zhí)行的run()方法就是在主線程中去執(zhí)行的,因?yàn)檎麄€(gè)程序就只有一個(gè)線程(即主線程)。

總結(jié)一下:

  • 每個(gè)線程都是一個(gè)獨(dú)立的執(zhí)行流。
  • 每個(gè)線程都可以執(zhí)行一段代碼。
  • 每個(gè)線程之間是并發(fā)的關(guān)系。

好了,本文到這里就結(jié)束了,就到這里吧,再見(jiàn)啦友友們?。?!【Java系列】詳解多線程(一),Java系列,JavaEE學(xué)習(xí)專欄,java,開(kāi)發(fā)語(yǔ)言,java-ee文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-751581.html

到了這里,關(guān)于【Java系列】詳解多線程(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JavaEE初階:Java線程的狀態(tài)

    JavaEE初階:Java線程的狀態(tài)

    目錄 獲取當(dāng)前線程引用 休眠當(dāng)前線程 ?線程的狀態(tài) 1.NEW? ? ? ? ? ?? ? 2.TERMINATED? 3.RUNNABLE 4.WAITING 5.TIMED_WAITING 6.BLOCKED 多線程的意義 單線程 ?多線程 這個(gè)方法返回當(dāng)前線程的引用。但是我們會(huì)對(duì)static有疑惑,這其實(shí)是一個(gè)靜態(tài)方法,更好的說(shuō)法是這是一個(gè) 類方法, 調(diào)用這

    2024年02月11日
    瀏覽(24)
  • Java多線程開(kāi)發(fā)系列之六:無(wú)限分解流----Fork/Join框架

    Java多線程開(kāi)發(fā)系列之六:無(wú)限分解流----Fork/Join框架

    Fork譯為拆分,Join譯為合并 Fork/Join框架的思路是把一個(gè)非常巨大的任務(wù),拆分成若然的小任務(wù),再由小任務(wù)繼續(xù)拆解。直至達(dá)到一個(gè)相對(duì)合理的任務(wù)粒度。然后執(zhí)行獲得結(jié)果,然后將這些小任務(wù)的結(jié)果匯總,生成大任務(wù)的結(jié)果, 直至匯總成最初巨大任務(wù)的結(jié)果。如下圖: 紅

    2024年02月08日
    瀏覽(21)
  • 【JavaEE】Java中的多線程 (Thread類)

    【JavaEE】Java中的多線程 (Thread類)

    作者主頁(yè): paper jie_博客 本文作者:大家好,我是paper jie,感謝你閱讀本文,歡迎一建三連哦。 本文錄入于《JavaEE》專欄,本專欄是針對(duì)于大學(xué)生,編程小白精心打造的。筆者用重金(時(shí)間和精力)打造,將基礎(chǔ)知識(shí)一網(wǎng)打盡,希望可以幫到讀者們哦。 其他專欄:《MySQL》《

    2024年02月05日
    瀏覽(28)
  • 【Java系列】多線程案例學(xué)習(xí)——基于阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型

    【Java系列】多線程案例學(xué)習(xí)——基于阻塞隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專欄【Java系列專欄】【JaveEE學(xué)習(xí)專欄】 本專欄旨在分享學(xué)習(xí)JavaEE的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評(píng)論區(qū)交流討論?? 什么是阻塞式隊(duì)列(有兩點(diǎn)): 第一點(diǎn):當(dāng)隊(duì)列滿的時(shí)候

    2024年02月04日
    瀏覽(23)
  • 【JavaEE】什么是多線程?進(jìn)程和線程的區(qū)別是什么?如何使用Java實(shí)現(xiàn)多線程?

    【JavaEE】什么是多線程?進(jìn)程和線程的區(qū)別是什么?如何使用Java實(shí)現(xiàn)多線程?

    前面我們了解了什么是進(jìn)程以及如何實(shí)現(xiàn)進(jìn)程調(diào)度,那么今天我將為大家分享關(guān)于線程相關(guān)的知識(shí)。在學(xué)習(xí)線程之前,我們認(rèn)為進(jìn)程是操作系統(tǒng)執(zhí)行獨(dú)立執(zhí)行的單位,但其實(shí)并不然。線程是操作系統(tǒng)中能夠獨(dú)立執(zhí)行的最小單元。只有掌握了什么是線程,我們才能實(shí)現(xiàn)后面的并

    2024年02月09日
    瀏覽(24)
  • 【JavaEE】JUC(java.util.concurrent)的常見(jiàn)類以及線程安全的集合類

    【JavaEE】JUC(java.util.concurrent)的常見(jiàn)類以及線程安全的集合類

    目錄 1、JUC(java.util.concurrent)的常見(jiàn)類 1.1、Callable接口的用法(創(chuàng)建線程的一種寫法) ?1.2、ReentrantLock可重入互斥鎖 1.2.1、ReentrantLock和synchronized的區(qū)別? 1.2.2、如何選擇使用哪個(gè)鎖 1.3、Semaphore信號(hào)量 1.4、CountDownLatch ?2、線程安全的集合類 2.1、多線程環(huán)境使用ArrayList ?2.2、

    2024年02月07日
    瀏覽(33)
  • 【JavaEE基礎(chǔ)學(xué)習(xí)打卡00】該專欄知識(shí)大綱在這里!

    【JavaEE基礎(chǔ)學(xué)習(xí)打卡00】該專欄知識(shí)大綱在這里!

    ?? 本系列教程適用于 Java Web 初學(xué)者、愛(ài)好者,小白白。我們的天賦并不高,可貴在努力,堅(jiān)持不放棄。堅(jiān)信量最終引發(fā)質(zhì)變,厚積薄發(fā)。 ?? 文中白話居多,盡量以小白視角呈現(xiàn),幫助大家快速入門。 ?? 我是 蝸牛老師 ,之前網(wǎng)名是 Ongoing蝸牛 ,人如其名,干啥都慢,所

    2024年02月10日
    瀏覽(23)
  • 【Java 線程系列】Java 天生就是多線程

    作者:半身風(fēng)雪 上一篇:線程之間的共享和協(xié)作

    2024年02月05日
    瀏覽(27)
  • JavaEE(系列14) -- 多線程(Callable)

    Callable 是一個(gè) interface . 相當(dāng)于把線程封裝了一個(gè) \\\"返回值\\\". 方便程序猿借助多線程的方式計(jì)算結(jié)果. 代碼示例 :?創(chuàng)建線程計(jì)算 1 + 2 + 3 + ... + 1000, 不使用 Callable 版本 思路 : 創(chuàng)建一個(gè)類Result,包含?sum 表示最終結(jié)果, lock 表示線程同步使用的鎖對(duì)象. main 方法中先創(chuàng)建 Result 實(shí)例,

    2024年02月06日
    瀏覽(18)
  • 多線程(JavaEE初階系列4)

    多線程(JavaEE初階系列4)

    目錄 前言: 1.單例模式 1.1餓漢模式 1.2懶漢模式 1.3結(jié)合線程安全下的單例模式 1.4單例模式總結(jié) 2.阻塞式隊(duì)列 2.1什么是阻塞隊(duì)列 2.2生產(chǎn)者消費(fèi)者模型 2.2.1?上下游模塊之間進(jìn)行“解耦合” 2.2.2削峰填谷 2.3阻塞隊(duì)列的實(shí)現(xiàn) 結(jié)束語(yǔ): 在上節(jié)中小編主要與大家分享了多線程中遇到

    2024年02月15日
    瀏覽(41)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包