一 為什么使用多線程
多線程能夠幫助設(shè)計(jì)更具有響應(yīng)性的圖形界面,尤其是多媒體應(yīng)用程序的圖形界面。想象一下,如果我們想要從Internet上下載一段很長(zhǎng)的視頻或者音頻片段,如果我們可以把下載任務(wù)放在一個(gè)獨(dú)立的線程里實(shí)現(xiàn),我們?cè)谙螺d開始之后很快就可以觀看這個(gè)片段了,而不是必須等全部下載完成才可以觀看。此外,多線程的執(zhí)行還可以允許許多用戶同時(shí)訪問一個(gè)公共的數(shù)據(jù)庫,這個(gè)特性對(duì)于類似庫存管理和機(jī)票預(yù)定這樣的系統(tǒng)有時(shí)候顯得非常有用。為了防止由于多個(gè)用戶同時(shí)讀取和寫入公共數(shù)據(jù)庫而造成的數(shù)據(jù)破壞,多線程還需要在對(duì)象上設(shè)置鎖。這樣一個(gè)時(shí)刻只有一個(gè)線程能夠修改一個(gè)對(duì)象的狀態(tài)。
二 線程和進(jìn)程之間的區(qū)別
對(duì)于上面的使用多線程的理由,是否可以也使用進(jìn)程來實(shí)現(xiàn)同樣的效果呢?并發(fā)的進(jìn)程和并發(fā)的線程之間的區(qū)別是非常關(guān)鍵的。線程是在進(jìn)程內(nèi)執(zhí)行的。在典型的情況下,一個(gè)進(jìn)程需要他自己的地址空間,二同時(shí)執(zhí)行的多線程則共享相同的地址空間,也就是他們所在的進(jìn)程的地址空間。這就使得多個(gè)線程更容易訪問內(nèi)存中的相同數(shù)據(jù)。同時(shí),線程切換所需要的時(shí)間也比進(jìn)程切換的時(shí)間要短。另外線程間的通信比進(jìn)程間的通信要快的多(線程的創(chuàng)建速度比進(jìn)程的創(chuàng)建速度快10到100倍)
三 多線程程序的運(yùn)行
在一個(gè)多線程程序里,不同的線程可以有不同的優(yōu)先級(jí)。但是這些優(yōu)先級(jí)實(shí)際上如何發(fā)揮作用,在不同的系統(tǒng)中可能會(huì)有很大的差異。在普通情況下,具有最高優(yōu)先級(jí)的線程被選擇執(zhí)行。一個(gè)具有當(dāng)前最高優(yōu)先級(jí)的線程將持續(xù)執(zhí)行,知道出現(xiàn)一個(gè)具有更高優(yōu)先級(jí)的線程。但是,在使用搶占式多任務(wù)系統(tǒng)中,線程被劃分為許多時(shí)間片,這樣每個(gè)線程都有可能被CPU選中。當(dāng)線程劃分為時(shí)間片時(shí),具有相同優(yōu)先級(jí)的線程輪流執(zhí)行。處理相同優(yōu)先級(jí)的線程的另一種方法是讓一個(gè)線程運(yùn)行直到結(jié)束為止,除非這個(gè)線程被另外一個(gè)尋求執(zhí)行的具有更高優(yōu)先級(jí)的線程搶占(稱為優(yōu)先級(jí)強(qiáng)搶占式多任務(wù)),或者由于一條sleep或者wait命令而暫時(shí)停止執(zhí)行。
具有多線程能力的編程語言的效率最終依賴于線程如何映射到底層操作系統(tǒng)的本地線程中。這種映射關(guān)系在絕大多數(shù)情況下對(duì)于編寫應(yīng)用程序的程序員是隱藏的。對(duì)于一種編程語言而言,這種映射關(guān)系因編譯器而異。以java為例,java虛擬機(jī)的有些實(shí)現(xiàn)采用了綠線程,他們都是操作系統(tǒng)的一個(gè)單一的本地線程中執(zhí)行的。java虛擬機(jī)的其他一些實(shí)現(xiàn)可以直接使用本地線程,這就允許java的線程在多處理器計(jì)算機(jī)上并行執(zhí)行。但是java虛擬機(jī)的另外一些實(shí)現(xiàn)有可能動(dòng)態(tài)的把n個(gè)java線程映射到m個(gè)本地線程中。在Linux中,每個(gè)java線程可能會(huì)映射到操作系統(tǒng)的一個(gè)獨(dú)立的進(jìn)程中。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。