一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語(yǔ)言 - JAVA教程 - 剖析Java中線程編程的概念

剖析Java中線程編程的概念

2020-01-07 14:19goldensun JAVA教程

這篇文章主要介紹了Java中線程編程的概念,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

Java線程的概念
和其他多數(shù)計(jì)算機(jī)語(yǔ)言不同,Java內(nèi)置支持多線程編程(multithreaded programming)。

多線程程序包含兩條或兩條以上并發(fā)運(yùn)行的部分。程序中每個(gè)這樣的部分都叫一個(gè)線程(thread),每個(gè)線程都有獨(dú)立的執(zhí)行路徑。因此,多線程是多任務(wù)處理的一種特殊形式。

你一定知道多任務(wù)處理,因?yàn)樗鼘?shí)際上被所有的現(xiàn)代操作系統(tǒng)所支持。然而,多任務(wù)處理有兩種截然不同的類型:基于進(jìn)程的和基于線程的。認(rèn)識(shí)兩者的不同是十分重要的。

對(duì)很多讀者,基于進(jìn)程的多任務(wù)處理是更熟悉的形式。進(jìn)程(process)本質(zhì)上是一個(gè)執(zhí)行的程序。因此,基于進(jìn)程(process-based) 的多任務(wù)處理的特點(diǎn)是允許你的計(jì)算機(jī)同時(shí)運(yùn)行兩個(gè)或更多的程序。舉例來(lái)說(shuō),基于進(jìn)程的多任務(wù)處理使你在運(yùn)用文本編輯器的時(shí)候可以同時(shí)運(yùn)行Java編譯器。在基于進(jìn)程的多任務(wù)處理中,程序是調(diào)度程序所分派的最小代碼單位。

在基于線程(thread-based) 的多任務(wù)處理環(huán)境中,線程是最小的執(zhí)行單位。這意味著一個(gè)程序可以同時(shí)執(zhí)行兩個(gè)或者多個(gè)任務(wù)的功能。例如,一個(gè)文本編輯器可以在打印的同時(shí)格式化文本。所以,多進(jìn)程程序處理“大圖片”,而多線程程序處理細(xì)節(jié)問(wèn)題。

多線程程序比多進(jìn)程程序需要更少的管理費(fèi)用。進(jìn)程是重量級(jí)的任務(wù),需要分配它們自己獨(dú)立的地址空間。進(jìn)程間通信是昂貴和受限的。進(jìn)程間的轉(zhuǎn)換也是很需要花費(fèi)的。另一方面,線程是輕量級(jí)的選手。它們共享相同的地址空間并且共同分享同一個(gè)進(jìn)程。線程間通信是便宜的,線程間的轉(zhuǎn)換也是低成本的。當(dāng)Java程序使用多進(jìn)程任務(wù)處理環(huán)境時(shí),多進(jìn)程程序不受Java的控制,而多線程則受Java控制。

多線程幫助你寫(xiě)出CPU最大利用率的高效程序,因?yàn)榭臻e時(shí)間保持最低。這對(duì)Java運(yùn)行的交互式的網(wǎng)絡(luò)互連環(huán)境是至關(guān)重要的,因?yàn)榭臻e時(shí)間是公共的。舉個(gè)例子來(lái)說(shuō),網(wǎng)絡(luò)的數(shù)據(jù)傳輸速率遠(yuǎn)低于計(jì)算機(jī)處理能力,本地文件系統(tǒng)資源的讀寫(xiě)速度遠(yuǎn)低于CPU的處理能力,當(dāng)然,用戶輸入也比計(jì)算機(jī)慢很多。在傳統(tǒng)的單線程環(huán)境中,你的程序必須等待每一個(gè)這樣的任務(wù)完成以后才能執(zhí)行下一步——盡管CPU有很多空閑時(shí)間。多線程使你能夠獲得并充分利用這些空閑時(shí)間。

Java線程模型
Java運(yùn)行系統(tǒng)在很多方面依賴于線程,所有的類庫(kù)設(shè)計(jì)都考慮到多線程。實(shí)際上,Java使用線程來(lái)使整個(gè)環(huán)境異步。這有利于通過(guò)防止CPU循環(huán)的浪費(fèi)來(lái)減少無(wú)效部分。

為更好的理解多線程環(huán)境的優(yōu)勢(shì)可以將它與它的對(duì)照物相比較。單線程系統(tǒng)的處理途徑是使用一種叫作輪詢的事件循環(huán)方法。在該模型中,單線程控制在一無(wú)限循環(huán)中運(yùn)行,輪詢一個(gè)事件序列來(lái)決定下一步做什么。一旦輪詢裝置返回信號(hào)表明,已準(zhǔn)備好讀取網(wǎng)絡(luò)文件,事件循環(huán)調(diào)度控制管理到適當(dāng)?shù)氖录幚沓绦颉V钡绞录幚沓绦蚍祷兀到y(tǒng)中沒(méi)有其他事件發(fā)生。這就浪費(fèi)了CPU時(shí)間。這導(dǎo)致了程序的一部分獨(dú)占了系統(tǒng),阻止了其他事件的執(zhí)行。總的來(lái)說(shuō),單線程環(huán)境,當(dāng)一個(gè)線程因?yàn)榈却Y源時(shí)阻塞(block,掛起執(zhí)行),整個(gè)程序停止運(yùn)行。

Java多線程的優(yōu)點(diǎn)在于取消了主循環(huán)/輪詢機(jī)制。一個(gè)線程可以暫停而不影響程序的其他部分。例如,當(dāng)一個(gè)線程從網(wǎng)絡(luò)讀取數(shù)據(jù)或等待用戶輸入時(shí)產(chǎn)生的空閑時(shí)間可以被利用到其他地方。多線程允許活的循環(huán)在每一幀間隙中沉睡一秒而不暫停整個(gè)系統(tǒng)。在Java程序中出現(xiàn)線程阻塞,僅有一個(gè)線程暫停,其他線程繼續(xù)運(yùn)行。

線程存在于好幾種狀態(tài)。線程可以正在運(yùn)行(running)。只要獲得CPU時(shí)間它就可以運(yùn)行。運(yùn)行的線程可以被掛起(suspend),并臨時(shí)中斷它的執(zhí)行。一個(gè)掛起的線程可以被恢復(fù)(resume,允許它從停止的地方繼續(xù)運(yùn)行。一個(gè)線程可以在等待資源時(shí)被阻塞(block)。

在任何時(shí)候,線程可以終止(terminate),這立即中斷了它的運(yùn)行。一旦終止,線程不能被恢復(fù)。
線程優(yōu)先級(jí)

Java給每個(gè)線程安排優(yōu)先級(jí)以決定與其他線程比較時(shí)該如何對(duì)待該線程。線程優(yōu)先級(jí)是詳細(xì)說(shuō)明線程間優(yōu)先關(guān)系的整數(shù)。作為絕對(duì)值,優(yōu)先級(jí)是毫無(wú)意義的;當(dāng)只有一個(gè)線程時(shí),優(yōu)先級(jí)高的線程并不比優(yōu)先權(quán)低的線程運(yùn)行的快。相反,線程的優(yōu)先級(jí)是用來(lái)決定何時(shí)從一個(gè)運(yùn)行的線程切換到另一個(gè)。這叫“上下文轉(zhuǎn)換”(context switch)。決定上下文轉(zhuǎn)換發(fā)生的規(guī)則很簡(jiǎn)單:
線程可以自動(dòng)放棄控制。在I/O未決定的情況下,睡眠或阻塞由明確的讓步來(lái)完成。在這種假定下,所有其他的線程被檢測(cè),準(zhǔn)備運(yùn)行的最高優(yōu)先級(jí)線程被授予CPU。
線程可以被高優(yōu)先級(jí)的線程搶占。在這種情況下,低優(yōu)先級(jí)線程不主動(dòng)放棄,處理器只是被先占——無(wú)論它正在干什么——處理器被高優(yōu)先級(jí)的線程占據(jù)。基本上,一旦高優(yōu)先級(jí)線程要運(yùn)行,它就執(zhí)行。這叫做有優(yōu)先權(quán)的多任務(wù)處理。

當(dāng)兩個(gè)相同優(yōu)先級(jí)的線程競(jìng)爭(zhēng)CPU周期時(shí),情形有一點(diǎn)復(fù)雜。對(duì)于Windows98這樣的操作系統(tǒng),等優(yōu)先級(jí)的線程是在循環(huán)模式下自動(dòng)劃分時(shí)間的。對(duì)于其他操作系統(tǒng),例如Solaris 2.x,等優(yōu)先級(jí)線程相對(duì)于它們的對(duì)等體自動(dòng)放棄。如果不這樣,其他的線程就不會(huì)運(yùn)行。

警告:不同的操作系統(tǒng)下等優(yōu)先級(jí)線程的上下文轉(zhuǎn)換可能會(huì)產(chǎn)生錯(cuò)誤。
同步性

因?yàn)槎嗑€程在你的程序中引入了一個(gè)異步行為,所以在你需要的時(shí)候必須有加強(qiáng)同步性的方法。舉例來(lái)說(shuō),如果你希望兩個(gè)線程相互通信并共享一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如鏈表序列,你需要某些方法來(lái)確保它們沒(méi)有相互沖突。也就是說(shuō),你必須防止一個(gè)線程寫(xiě)入數(shù)據(jù)而另一個(gè)線程正在讀取鏈表中的數(shù)據(jù)。為此目的,Java在進(jìn)程間同步性的老模式基礎(chǔ)上實(shí)行了另一種方法:管程(monitor)。管程是一種由C.A.R.Hoare首先定義的控制機(jī)制。

你可以把管程想象成一個(gè)僅控制一個(gè)線程的小盒子。一旦線程進(jìn)入管程,所有線程必須等待直到該線程退出了管程。用這種方法,管程可以用來(lái)防止共享的資源被多個(gè)線程操縱。

很多多線程系統(tǒng)把管程作為程序必須明確的引用和操作的對(duì)象。Java提供一個(gè)清晰的解決方案。沒(méi)有“Monitor”類;相反,每個(gè)對(duì)象都擁有自己的隱式管程,當(dāng)對(duì)象的同步方法被調(diào)用時(shí)管程自動(dòng)載入。一旦一個(gè)線程包含在一個(gè)同步方法中,沒(méi)有其他線程可以調(diào)用相同對(duì)象的同步方法。這就使你可以編寫(xiě)非常清晰和簡(jiǎn)潔的多線程代碼,因?yàn)橥街С质钦Z(yǔ)言內(nèi)置的。
消息傳遞

在你把程序分成若干線程后,你就要定義各線程之間的聯(lián)系。用大多數(shù)其他語(yǔ)言規(guī)劃時(shí),你必須依賴于操作系統(tǒng)來(lái)確立線程間通信。這樣當(dāng)然增加花費(fèi)。然而,Java提供了多線程間談話清潔的、低成本的途徑——通過(guò)調(diào)用所有對(duì)象都有的預(yù)先確定的方法。Java的消息傳遞系統(tǒng)允許一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)同步方法,然后在那里等待,直到其他線程明確通知它出來(lái)。
Thread 類和Runnable 接口

Java的多線程系統(tǒng)建立于Thread類,它的方法,它的共伴接口Runnable基礎(chǔ)上。Thread類封裝了線程的執(zhí)行。既然你不能直接引用運(yùn)行著的線程的狀態(tài),你要通過(guò)它的代理處理它,于是Thread 實(shí)例產(chǎn)生了。為創(chuàng)建一個(gè)新的線程,你的程序必須擴(kuò)展Thread 或?qū)崿F(xiàn)Runnable接口。

Thread類定義了好幾種方法來(lái)幫助管理線程。本章用到的方法如表所示:
剖析Java中線程編程的概念

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久婷婷五月综合色精品首页 | 按摩院已婚妇女中文字幕 | 亚洲视频在线免费观看 | bl双性肉文 | 99久视频| 日韩精品福利视频一区二区三区 | 青青青手机在线观看 | 日韩欧美高清 | 精品亚洲一区二区三区在线播放 | 视频大全在线观看免费 | 午夜一级免费视频 | 紧缚束缚调教丨vk | 四虎影库紧急大通知 | ak福利影院 | 热巴在公交车h文 | 消息称老熟妇乱视频一区二区 | 我们中文在线观看免费完整版 | 欧美最新在线 | 国产精品免费小视频 | 国产91精品久久久久久 | 欧美另类xxx精品人妖 | 亚洲国产免费 | 无遮免费网站在线入口 | 52av我爱avhaose01好 | 日本大学jalapsiki | 国产精品久久久久这里只有精品 | 久久青青草原精品国产软件 | 国产裸舞福利资源在线视频 | 大胸孕妇孕交pregnantsex 大象视频污 | 亚洲一区二区精品推荐 | 无码专区aaaaaa免费视频 | 国产成人亚洲影视在线 | 天美麻豆 | 亚欧洲乱码视频一二三区 | adult video在线观看 | 日本免费精品 | 日韩精品一区二区三区中文版 | 国产aaa毛片 | 阿 好深 快点 老师受不了 | 成年私人影院免费视频网站 | 男神插曲女生动漫完整版动漫 |