亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

Java 線(xiàn)程實(shí)現(xiàn)方式

曹金海 / 3464人閱讀

摘要:線(xiàn)程的可能實(shí)現(xiàn)方式基本上主流的操作系統(tǒng)都支持線(xiàn)程,也提供了線(xiàn)程的實(shí)現(xiàn)。使用用戶(hù)線(xiàn)程和內(nèi)核線(xiàn)程混合實(shí)現(xiàn)在這種混合實(shí)現(xiàn)下,既存在用戶(hù)線(xiàn)程,也存在內(nèi)核線(xiàn)程。

進(jìn)程與線(xiàn)程

在傳統(tǒng)的操作系統(tǒng)中,最核心的概念是“進(jìn)程”,進(jìn)程是對(duì)正在運(yùn)行的程序的一個(gè)抽象。
進(jìn)程的存在讓“并行”成為了可能,在一個(gè)操作系統(tǒng)中,允許運(yùn)行著多個(gè)進(jìn)程,這些進(jìn)程“看起來(lái)”是同時(shí)在運(yùn)行的。
如果我們的計(jì)算機(jī)同時(shí)運(yùn)行著 web 瀏覽器、電子郵件客戶(hù)端、即時(shí)通訊軟件例如QQ微信等多個(gè)進(jìn)程,我們感覺(jué)這些進(jìn)程都是同時(shí)在運(yùn)行的,假設(shè)這臺(tái)計(jì)算機(jī)搭配的是多個(gè) CPU 或者 多核 CPU,那么這種多個(gè)進(jìn)程并行的現(xiàn)象可能一點(diǎn)也不奇怪,完全可以為每個(gè)進(jìn)程多帶帶分配一個(gè) CPU,這樣就實(shí)現(xiàn)了多進(jìn)程并行。
然而事實(shí)上,在計(jì)算機(jī)只有一個(gè) CPU 的情況下,它也能給人類(lèi)一種感覺(jué):多個(gè)進(jìn)程同時(shí)在運(yùn)行。但人類(lèi)的感覺(jué)往往是比較模糊的,不精確的。事實(shí)是由于 CPU 的計(jì)算速度非常地快,它能快速地在各個(gè)進(jìn)程之間切換,在某一瞬間,CPU 只能運(yùn)行一個(gè)進(jìn)程,但一秒鐘之內(nèi),它就能通過(guò)快速切換,讓人產(chǎn)生多個(gè)進(jìn)程同時(shí)在運(yùn)行的錯(cuò)覺(jué)。
在操作系統(tǒng)中,為什么在進(jìn)程的基礎(chǔ)上,又衍生出了線(xiàn)程的概念呢?

由于對(duì)于一些進(jìn)程而言,它內(nèi)部會(huì)發(fā)生多種活動(dòng),有些活動(dòng)可能會(huì)在某個(gè)時(shí)間里阻塞,有些活動(dòng)不會(huì),如果通過(guò)線(xiàn)程將這些活動(dòng)分離開(kāi)使它們能夠并行地運(yùn)行,則設(shè)計(jì)程序的時(shí)候會(huì)更加簡(jiǎn)單。

線(xiàn)程比進(jìn)程的創(chuàng)建更加輕量級(jí),性能消耗更少

如果一個(gè)進(jìn)程既需要 CPU 計(jì)算,也需要I/O處理,擁有多線(xiàn)程允許這些活動(dòng)重疊進(jìn)行,加快整個(gè)進(jìn)程的執(zhí)行速度。

每一個(gè)進(jìn)程在操作系統(tǒng)中都擁有獨(dú)立的一塊內(nèi)存地址空間,該進(jìn)程創(chuàng)建的所有線(xiàn)程共享這塊內(nèi)存,支持多線(xiàn)程的操作系統(tǒng),會(huì)讓線(xiàn)程作為 CPU 調(diào)度的最小單位。CPU 的時(shí)間片在不同的線(xiàn)程之間進(jìn)行分配。

線(xiàn)程的可能實(shí)現(xiàn)方式

基本上主流的操作系統(tǒng)都支持線(xiàn)程,也提供了線(xiàn)程的實(shí)現(xiàn)。而 Java 語(yǔ)言為了應(yīng)對(duì)不同硬件和操作系統(tǒng)的差異,提供了對(duì)線(xiàn)程操作的統(tǒng)一抽象,在 Java 中我們使用 Thread 類(lèi)來(lái)代表一個(gè)線(xiàn)程。
Thread 的具體實(shí)現(xiàn)可能會(huì)有不同的實(shí)現(xiàn)方式:

使用內(nèi)核線(xiàn)程實(shí)現(xiàn)

內(nèi)核線(xiàn)程是操作系統(tǒng)內(nèi)核支持的線(xiàn)程,在內(nèi)核中有一個(gè)線(xiàn)程表用來(lái)記錄系統(tǒng)中的所有線(xiàn)程,創(chuàng)建或者銷(xiāo)毀一個(gè)線(xiàn)程時(shí),都需要涉及到系統(tǒng)調(diào)用,然后再內(nèi)核中對(duì)線(xiàn)程表進(jìn)行更新操作。對(duì)內(nèi)核線(xiàn)程的阻塞以及其它操作,都涉及到系統(tǒng)調(diào)用,系統(tǒng)調(diào)用的代價(jià)都比較大,涉及到在用戶(hù)態(tài)和內(nèi)核態(tài)之間的來(lái)回切換。此外,內(nèi)核內(nèi)部有線(xiàn)程調(diào)度器,用于決定應(yīng)該將 CPU 時(shí)間片分配個(gè)哪個(gè)線(xiàn)程。
程序一般不會(huì)直接操作內(nèi)核線(xiàn)程,而是使用內(nèi)核線(xiàn)程的一種高級(jí)接口,輕量級(jí)進(jìn)程。輕量級(jí)進(jìn)程與內(nèi)核線(xiàn)程之間的關(guān)系是 1:1,每一個(gè)輕量級(jí)進(jìn)程內(nèi)部都有一個(gè)內(nèi)核線(xiàn)程支持。

上圖中, LWP 指 Light Weight Process,即輕量級(jí)進(jìn)程;KLT 指 Kernel Level Thread,即內(nèi)核線(xiàn)程。

使用用戶(hù)線(xiàn)程實(shí)現(xiàn)

用戶(hù)線(xiàn)程是程序或者編程語(yǔ)言自己實(shí)現(xiàn)的線(xiàn)程庫(kù),系統(tǒng)內(nèi)核無(wú)法感知到這些線(xiàn)程的存在。用戶(hù)線(xiàn)程的建立、同步、銷(xiāo)毀和調(diào)度,都在用戶(hù)態(tài)中完成,無(wú)須內(nèi)核的幫助,不需要進(jìn)行系統(tǒng)調(diào)用,這樣的好處是對(duì)于線(xiàn)程的操作是非常高效的。在這種情況下,進(jìn)程和用戶(hù)線(xiàn)程的比例是 1 :N。

用戶(hù)態(tài)線(xiàn)程面對(duì)如何阻塞線(xiàn)程時(shí),會(huì)面臨困難,阻塞一個(gè)用戶(hù)態(tài)線(xiàn)程會(huì)出現(xiàn)把整個(gè)進(jìn)程都阻塞的情況,多線(xiàn)程也就失去了意義。因?yàn)槿鄙賰?nèi)核的支持,所以很多需要利用內(nèi)核才能完成的工作,例如阻塞與喚醒線(xiàn)程、多 CPU 環(huán)境下線(xiàn)程的映射等,都需要用戶(hù)程序去實(shí)現(xiàn),實(shí)現(xiàn)起來(lái)會(huì)異常困難。

使用用戶(hù)線(xiàn)程和內(nèi)核線(xiàn)程混合實(shí)現(xiàn)

在這種混合實(shí)現(xiàn)下,既存在用戶(hù)線(xiàn)程,也存在內(nèi)核線(xiàn)程。用戶(hù)態(tài)線(xiàn)程的創(chuàng)建、切換這些操作依然很高效,并且用戶(hù)態(tài)實(shí)現(xiàn)的線(xiàn)程,比較容易加大線(xiàn)程的規(guī)模。需要操作系統(tǒng)內(nèi)核支持的功能,則通過(guò)內(nèi)核線(xiàn)程來(lái)做到,例如映射到不同的處理器上、處理線(xiàn)程的阻塞與喚醒以及內(nèi)核線(xiàn)程的調(diào)度等。這種實(shí)現(xiàn)依然會(huì)使用到輕量級(jí)進(jìn)程 LWP,它是用戶(hù)線(xiàn)程和內(nèi)核線(xiàn)程之間的橋梁。

Java 線(xiàn)程的實(shí)現(xiàn)

在 JDK1.2 之前, Java 的線(xiàn)程是使用用戶(hù)線(xiàn)程實(shí)現(xiàn)的,在 JDK1.2 之后,Java 才采用操作系統(tǒng)原生支持的線(xiàn)程模型來(lái)實(shí)現(xiàn),Java 線(xiàn)程模型的實(shí)現(xiàn)方式,主要取決于操作系統(tǒng)。對(duì)于 Oracle JDK 來(lái)說(shuō),在 Windows 和 Linux 上的線(xiàn)程模型是采用一對(duì)一的方式實(shí)現(xiàn)的,即一條 Java 線(xiàn)程映射到一條輕量級(jí)進(jìn)程(內(nèi)核線(xiàn)程)。而在 Solaris 平臺(tái)中,Java 則支持 1 :1 和 N : M 的線(xiàn)程模型。

線(xiàn)程的阻塞與等待

Java 中的線(xiàn)程的狀態(tài)有以下幾種:New,Runnable,Waiting, TimedWaiting, Blocked,Terminated。

NEW:線(xiàn)程初創(chuàng)建,未運(yùn)行

RUNNABLE:線(xiàn)程正在運(yùn)行,但不一定消耗 CPU

BLOCKED:線(xiàn)程正在等待另外一個(gè)線(xiàn)程釋放鎖

WAITING:線(xiàn)程執(zhí)行了 wait, join, LockSupport.park() 方法

TIMED_WAITING:線(xiàn)程調(diào)用了sleep, wait, join, LockSupport.parkNanos() 等方法,與 WAITING 狀態(tài)不同的是,這些方法帶有表示時(shí)間的參數(shù)。

其中 Blocked 和 Waiting 有個(gè)重要的區(qū)別是,阻塞(Blocked)狀態(tài)的線(xiàn)程在等待獲取一個(gè)排他鎖,例如線(xiàn)程在等待進(jìn)入一個(gè)synchronized關(guān)鍵字包圍的臨界區(qū)時(shí),就進(jìn)入 Blocked 狀態(tài)。而 Waiting 狀態(tài)則是在等待被喚醒,或者等待一段時(shí)間。

參考資料

《深入理解 Java 虛擬機(jī)》第二版 - 周志明
《現(xiàn)代操作系統(tǒng)》第四版 - Andrew S. Tanenbaum

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/77139.html

相關(guān)文章

  • 想進(jìn)大廠(chǎng)?50個(gè)多線(xiàn)程面試題,你會(huì)多少?【后25題】(二)

    摘要:大多數(shù)待遇豐厚的開(kāi)發(fā)職位都要求開(kāi)發(fā)者精通多線(xiàn)程技術(shù)并且有豐富的程序開(kāi)發(fā)調(diào)試優(yōu)化經(jīng)驗(yàn),所以線(xiàn)程相關(guān)的問(wèn)題在面試中經(jīng)常會(huì)被提到。掌握了這些技巧,你就可以輕松應(yīng)對(duì)多線(xiàn)程和并發(fā)面試了。進(jìn)入等待通行準(zhǔn)許時(shí),所提供的對(duì)象。 最近看到網(wǎng)上流傳著,各種面試經(jīng)驗(yàn)及面試題,往往都是一大堆技術(shù)題目貼上去,而沒(méi)有答案。 不管你是新程序員還是老手,你一定在面試中遇到過(guò)有關(guān)線(xiàn)程的問(wèn)題。Java語(yǔ)言一個(gè)重要的特點(diǎn)就...

    caozhijian 評(píng)論0 收藏0
  • java面試題

    摘要:抽象類(lèi)表示的是,這個(gè)對(duì)象是什么。下面提供了一個(gè)完整的有返回結(jié)果的多線(xiàn)程測(cè)試?yán)?,在下?yàn)證過(guò)沒(méi)問(wèn)題可以直接使用。創(chuàng)建固定數(shù)目線(xiàn)程的線(xiàn)程池。創(chuàng)建一個(gè)支持定時(shí)及周期性的任務(wù)執(zhí)行的線(xiàn)程池,多數(shù)情況下可用來(lái)替代類(lèi)。 接口和抽象類(lèi)有什么區(qū)別你選擇使用接口和抽象類(lèi)的依據(jù)是什么? 接口和抽象類(lèi)的概念不一樣。接口是對(duì)動(dòng)作的抽象,抽象類(lèi)是對(duì)根源的抽象。抽象類(lèi)表示的是,這個(gè)對(duì)象是什么。接口表示的是,這個(gè)對(duì)象...

    lentrue 評(píng)論0 收藏0
  • Java并發(fā)編程筆記(一)

    摘要:并發(fā)編程實(shí)戰(zhàn)水平很高,然而并不是本好書(shū)。一是多線(xiàn)程的控制,二是并發(fā)同步的管理。最后,使用和來(lái)關(guān)閉線(xiàn)程池,停止其中的線(xiàn)程。當(dāng)線(xiàn)程調(diào)用或等阻塞時(shí),對(duì)這個(gè)線(xiàn)程調(diào)用會(huì)使線(xiàn)程醒來(lái),并受到,且線(xiàn)程的中斷標(biāo)記被設(shè)置。 《Java并發(fā)編程實(shí)戰(zhàn)》水平很高,然而并不是本好書(shū)。組織混亂、長(zhǎng)篇大論、難以消化,中文翻譯也較死板。這里是一篇批評(píng)此書(shū)的帖子,很是貼切。俗話(huà)說(shuō):看到有這么多人罵你,我就放心了。 然而知...

    cnsworder 評(píng)論0 收藏0
  • 如何創(chuàng)建并運(yùn)行java線(xiàn)程

    摘要:例子如下可以用如下方式創(chuàng)建并運(yùn)行上述子類(lèi)一旦線(xiàn)程啟動(dòng)后方法就會(huì)立即返回,而不會(huì)等待到方法執(zhí)行完畢才返回。但是,事實(shí)上方法并非是由剛創(chuàng)建的新線(xiàn)程所執(zhí)行的,而是被創(chuàng)建新線(xiàn)程的當(dāng)前線(xiàn)程所執(zhí)行了。這是因?yàn)榫€(xiàn)程是并行執(zhí)行而非順序的。 showImg(http://segmentfault.com/img/bVbN5u); Java線(xiàn)程類(lèi)也是一個(gè)object類(lèi),它的實(shí)例都繼承自java.lang...

    宋華 評(píng)論0 收藏0
  • java

    摘要:多線(xiàn)程編程這篇文章分析了多線(xiàn)程的優(yōu)缺點(diǎn),如何創(chuàng)建多線(xiàn)程,分享了線(xiàn)程安全和線(xiàn)程通信線(xiàn)程池等等一些知識(shí)。 中間件技術(shù)入門(mén)教程 中間件技術(shù)入門(mén)教程,本博客介紹了 ESB、MQ、JMS 的一些知識(shí)... SpringBoot 多數(shù)據(jù)源 SpringBoot 使用主從數(shù)據(jù)源 簡(jiǎn)易的后臺(tái)管理權(quán)限設(shè)計(jì) 從零開(kāi)始搭建自己權(quán)限管理框架 Docker 多步構(gòu)建更小的 Java 鏡像 Docker Jav...

    honhon 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<