真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎樣實(shí)現(xiàn)Java線程的深入探討

這篇文章將為大家詳細(xì)講解有關(guān)怎樣實(shí)現(xiàn)Java線程的深入探討,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),慶云企業(yè)網(wǎng)站建設(shè),慶云品牌網(wǎng)站建設(shè),網(wǎng)站定制,慶云網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,慶云網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

1.什么是線程  


一般來說,我們把正在計(jì)算機(jī)中執(zhí)行的程序叫做"進(jìn)程"(Process) ,而不將其 
稱為程序(Program)。所謂"線程"(Thread),是"進(jìn)程"中某個(gè)單一順序的控制流。 
新興的操作系統(tǒng),如Mac,windows NT,Windows 95等,大多采用多線程的概念,把線 
程視為基本執(zhí)行單位。線程也是Java中的相當(dāng)重要的組成部分之一。 

甚至最簡單的Applet也是由多個(gè)線程來完成的。在Java中,任何一個(gè)Applet的 
paint()和update()方法都是由AWT(Abstract Window Toolkit)繪圖與事件處理線 
程調(diào)用的,而Applet 主要的里程碑方法——init(),start(),stop()和destory() 
——是由執(zhí)行該Applet的應(yīng)用調(diào)用的。 

單線程的概念沒有什么新的地方,真正有趣的是在一個(gè)程序中同時(shí)使用多個(gè)線 
程來完成不同的任務(wù)。某些地方用輕量進(jìn)程(Lightweig ht Process)來代替線程 
,線程與真正進(jìn)程的相似性在于它們都是單一順序控制流。然而線程被認(rèn)為輕量是 
由于它運(yùn)行于整個(gè)程序的上下文內(nèi),能使用整個(gè)程序共有的資源和程序環(huán)境。 

作為單一順序控制流,在運(yùn)行的程序內(nèi)線程必須擁有一些資源作為必要的開銷 
。例如,必須有執(zhí)行堆棧和程序計(jì)數(shù)器。在線程內(nèi)執(zhí)行的代碼只在它的上下文中起 
作用,因此某些地方用"執(zhí)行上下文"來代替"線程"。 

2.線程屬性 

為了正確有效地使用線程,必須理解線程的各個(gè)方面并了解Java 實(shí)時(shí)系統(tǒng)。 
必須知道如何提供線程體、線程的生命周期、實(shí)時(shí)系統(tǒng)如 何調(diào)度線程、線程組、 
什么是幽靈線程(Demo nThread)。 

(1)線程體 
所有的操作都發(fā)生在線程體中,在Java中線程體是從Thread類繼承的run()方 
法,或?qū)崿F(xiàn)Runnable接口的類中的run()方法。當(dāng)線程產(chǎn)生并初始化后,實(shí)時(shí)系統(tǒng)調(diào) 
用它的run()方法。run()方法內(nèi)的代碼實(shí)現(xiàn)所產(chǎn)生線程的行為,它是線程的主要部 
分。 

(2)線程狀態(tài) 
附圖表示了線程在它的生命周期內(nèi)的任何時(shí)刻所能處的狀態(tài)以及引起狀態(tài)改 
變的方法。這圖并不是完整的有限狀態(tài)圖,但基本概括了線程中比較感興趣和普遍 
的方面。以下討論有關(guān)線程生命周期以此為據(jù)。 


●新線程態(tài)(New Thread) 
產(chǎn)生一個(gè)Thread對象就生成一個(gè)新線程。當(dāng)線程處于"新線程"狀態(tài)時(shí),僅僅是 
一個(gè)空線程對象,它還沒有分配到系統(tǒng)資源。因此只能啟動或終止它。任何其他操 
作都會引發(fā)異常。 
●可運(yùn)行態(tài)(Runnable) 
start()方法產(chǎn)生運(yùn)行線程所必須的資源,調(diào)度線程執(zhí)行,并且調(diào)用線程的run 
()方法。在這時(shí)線程處于可運(yùn)行態(tài)。該狀態(tài)不稱為運(yùn)行態(tài)是因?yàn)檫@時(shí)的線程并不 
總是一直占用處理機(jī)。特別是對于只有一個(gè)處理機(jī)的PC而言,任何時(shí)刻只能有一個(gè) 
處于可運(yùn)行態(tài)的線程占用處理 機(jī)。Java通過調(diào)度來實(shí)現(xiàn)多線程對處理機(jī)的共享。 

●非運(yùn)行態(tài)(Not Runnable) 
當(dāng)以下事件發(fā)生時(shí),線程進(jìn)入非運(yùn)行態(tài)。 
①suspend()方法被調(diào)用; 
②sleep()方法被調(diào)用; 
③線程使用wait()來等待條件變量; 
④線程處于I/O等待。 
●死亡態(tài)(Dead) 
當(dāng)run()方法返回,或別的線程調(diào)用stop()方法,線程進(jìn)入死亡態(tài) 。通常Appl 
et使用它的stop()方法來終止它產(chǎn)生的所有線程。 

(3)線程優(yōu)先級 
雖然我們說線程是并發(fā)運(yùn)行的。然而事實(shí)常常并非如此。正如前面談到的,當(dāng) 
系統(tǒng)中只有一個(gè)cpu時(shí),以某種順序在單CPU情況下執(zhí)行多線程被稱為調(diào)度(schedu 
ling)。Java采用的是一種簡單、固定的調(diào)度法,即固定優(yōu)先級調(diào)度。這種算法是 
根據(jù)處于可運(yùn)行態(tài)線程的相對優(yōu)先級來實(shí)行調(diào)度。當(dāng)線程產(chǎn)生時(shí),它繼承原線程的 
優(yōu)先級。在需要時(shí)可對優(yōu)先級進(jìn)行修改。在任何時(shí)刻,如果有多條線程等待運(yùn)行, 
系統(tǒng)選擇優(yōu)先級最高的可運(yùn)行線程運(yùn)行。只有當(dāng)它停止、自動放棄、或由于某種 
原因成為非運(yùn)行態(tài)低優(yōu)先級的線程才能運(yùn)行。如果兩個(gè)線程具有相同的優(yōu)先級,它 
們將被交替地運(yùn)行。 
Java實(shí)時(shí)系統(tǒng)的線程調(diào)度算法還是強(qiáng)制性的,在任何時(shí)刻,如果一個(gè)比其他線 
程優(yōu)先級都高的線程的狀態(tài)變?yōu)榭蛇\(yùn)行態(tài),實(shí)時(shí)系統(tǒng)將選擇該線程來運(yùn)行。 

(4)幽靈線程 
任何一個(gè)Java線程都能成為幽靈線程。它是作為運(yùn)行于同一個(gè)進(jìn)程內(nèi)的對象 
和線程的服務(wù)提供者。例如,HotJava瀏覽器有一個(gè)稱為" 后臺圖片閱讀器"的幽靈 
線程,它為需要圖片的對象和線程從文件系統(tǒng)或網(wǎng)絡(luò)讀入圖片。 
幽靈線程是應(yīng)用中典型的獨(dú)立線程。它為同一應(yīng)用中的其他對象和線程提供 
服務(wù)。幽靈線程的run()方法一般都是無限循環(huán),等待服務(wù)請求。 

(5)線程組 
每個(gè)Java線程都是某個(gè)線程組的成員。線程組提供一種機(jī)制,使得多個(gè)線程集 
于一個(gè)對象內(nèi),能對它們實(shí)行整體操作。譬如,你能用一個(gè)方法調(diào)用來啟動或掛起 
組內(nèi)的所有線程。Java線程組由ThreadGroup類實(shí)現(xiàn)。 
當(dāng)線程產(chǎn)生時(shí),可以指定線程組或由實(shí)時(shí)系統(tǒng)將其放入某個(gè)缺省的線程組內(nèi)。 
線程只能屬于一個(gè)線程組,并且當(dāng)線程產(chǎn)生后不能改變它所屬的線程組。 

3.多線程程序 

對于多線程的好處這就不多說了。但是,它同樣也帶來了某些新的麻煩。只要 
在設(shè)計(jì)程序時(shí)特別小心留意,克服這些麻煩并不算太困難。 

(1)同步線程 
許多線程在執(zhí)行中必須考慮與其他線程之間共享數(shù)據(jù)或協(xié)調(diào)執(zhí)行狀態(tài)。這就 
需要同步機(jī)制。在Java中每個(gè)對象都有一把鎖與之對應(yīng)。但Java不提供單獨(dú)的lo 
ck和unlock操作。它由高層的結(jié)構(gòu)隱式實(shí)現(xiàn), 來保證操作的對應(yīng)。(然而,我們注 
意到Java虛擬機(jī)提供單獨(dú)的monito renter和monitorexit指令來實(shí)現(xiàn)lock和unlo 
ck操作。) 
synchronized語句計(jì)算一個(gè)對象引用,試圖對該對象完成鎖操作, 并且在完成 
鎖操作前停止處理。當(dāng)鎖操作完成synchronized語句體得到執(zhí)行。當(dāng)語句體執(zhí)行 
完畢(無論正常或異常),解鎖操作自動完成。作為面向?qū)ο蟮恼Z言,synchronized 
經(jīng)常與方法連用。一種比較好的辦法是,如果某個(gè)變量由一個(gè)線程賦值并由別的線 
程引用或賦值,那么所有對該變量的訪問都必須在某個(gè)synchromized語句或synch 
ronized方法內(nèi)。 
現(xiàn)在假設(shè)一種情況:線程1與線程2都要訪問某個(gè)數(shù)據(jù)區(qū),并且要求線程1的訪 
問先于線程2, 則這時(shí)僅用synchronized是不能解決問題的。這在unix或Windows 
NT中可用Simaphore來實(shí)現(xiàn)。而Java并不提供。在Java中提供的是wait()和noti 
fy()機(jī)制。使用如下: 
synchronized method-1(…){ call by thread 1. 
∥access data area; 
available=true; 
notify() 

synchronized method-2(…){∥call by thread 2. 
while(!available) 
try{ 
wait();∥wait for notify(). 
}catch (Interrupted Exception e){ 

∥access data area 

其中available是類成員變量,置初值為false。 
如果在method-2中檢查available為假,則調(diào)用wait()。wait()的作用是使線 
程2進(jìn)入非運(yùn)行態(tài),并且解鎖。在這種情況下,method-1可以被線程1調(diào)用。當(dāng)執(zhí)行 
notify()后。線程2由非運(yùn)行態(tài)轉(zhuǎn)變?yōu)榭蛇\(yùn)行態(tài)。當(dāng)method-1調(diào)用返回后。線程2 
可重新對該對象加鎖,加鎖成功后執(zhí)行wait()返回后的指令。這種機(jī)制也能適用于 
其他更復(fù)雜的情況。 

(2)死鎖 
如果程序中有幾個(gè)競爭資源的并發(fā)線程,那么保證均衡是很重要的。系統(tǒng)均衡 
是指每個(gè)線程在執(zhí)行過程中都能充分訪問有限的資源。系統(tǒng)中沒有餓死和死鎖的 
線程。Java并不提供對死鎖的檢測機(jī)制。對大多數(shù)的Java程序員來說防止死鎖是 
一種較好的選擇。最簡單的防止死鎖的方法是對競爭的資源引入序號,如果一個(gè)線 
程需要幾個(gè)資源,那么它必須先得到小序號的資源,再申請大序號的資源。 

關(guān)于怎樣實(shí)現(xiàn)Java線程的深入探討就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。


網(wǎng)站標(biāo)題:怎樣實(shí)現(xiàn)Java線程的深入探討
標(biāo)題URL:http://weahome.cn/article/gggeds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部