- 相關(guān)推薦
計(jì)算機(jī)二級考試JAVA基礎(chǔ)知識:線程
1 理解線程
許多程序,無論大小,都包含或多或少獨(dú)立于其他段的代碼段,如果代碼段可以在時間上并行執(zhí)行效率會更高。線程提供了這種方法。當(dāng)然,如果像大多數(shù)人一樣,你的計(jì)算機(jī)只有一個處理器,對任意時刻,你不能執(zhí)行多于一個的計(jì)算,但你可以并行地處理輸入/輸出操作。使用線程的另一個原因是在需要連續(xù)運(yùn)行的程序中允許同時處理程序中其他的活動,例如,在同一個程序中一個連續(xù)運(yùn)行的動畫與另一個活動并行。在web頁中 Java的小應(yīng)用程序在你的瀏覽器控制下執(zhí)行,線程使多個小應(yīng)用程序可以同時一執(zhí)行。在這種情況下,線程將在瀏覽器控制下運(yùn)行的程序分成段以便它好及時運(yùn)行。如果你只有一個處理器,你的操作系統(tǒng)會造成一個錯覺,由于在任意一個給定的時刻只有一個線程可以執(zhí)行指令,但這是一個非常有效的錯覺。為了產(chǎn)生動畫,你可以將繪制一系列靜止畫面的代碼放入一個循環(huán)中:
通常繪制圖像的代碼在計(jì)時器的控制一下運(yùn)行,因此是在一個固定的速率下執(zhí)行,比方說每秒20次。當(dāng)然,當(dāng)循環(huán)運(yùn)行時同一個線程中不會發(fā)生其他的事。如果你想有另一個運(yùn)行的動畫,它必須在一個獨(dú)立的線程中。然后你的操作系統(tǒng)多任務(wù)的能力允許兩個線程分一享有效的處理器時間,因此,允許兩個動畫的運(yùn)行。在第16章我們將研究如何編寫動畫程序。
2 管理線程
在這章的兩個例子中我們看到,線程被啟動,然后競爭計(jì)算機(jī)資源。因?yàn)槿齻線程對處理器的竟?fàn)幉捎貌皇芸刂频姆椒,所以線程的輸出次序混亂。在程序中通常這是不希望看到的。在絕大多數(shù)使用線程的例子中,線程執(zhí)行的方法需要被管理才能使線程彼此不產(chǎn)生沖突。
當(dāng)然,在我們的例子中,程序被故意構(gòu)造成通過輸出一個名字中途釋放處理器的控制。
雖然這是非常做作的,但類似情況也會在現(xiàn)實(shí)中出現(xiàn),特別是在重復(fù)操作的線程中出現(xiàn)。能夠認(rèn)識到當(dāng)一個原始語句執(zhí)行時一個線程能被中斷是很重要的。例如:假設(shè)一個線程執(zhí)行語句:
i=i+1
在這個語句仍在執(zhí)行時,線程的執(zhí)行被中斷是極有可能的,也許存i值被取來增1之后,但在結(jié)果被存回i之前。沒有適當(dāng)控制,另一個訪問i的線程會在這一時刻改變i的值:結(jié)果是在這個線程中i沒有增1.
兩個或多個線程分享一個公用資源的地方,如文件或內(nèi)存塊,你需要決策確保一個線程不能修改另一個線程正在使用的資源。當(dāng)一木線程更新文件中的一個記錄時而另一個線程中途檢索同一個記錄是帶來災(zāi)難的方法。管理這種情況的一個方法是使用線程中包含的同步(synchronization)
同步
同步的目標(biāo)是當(dāng)幾個線程想訪問同一個資源時,確保在仟何指定時刻只能有一個線程訪問它。用同步管理你的線程執(zhí)行有兩種方法;
在方法一級管理代碼,包括同步方法
在塊一級管理代碼一使用同步塊
首先我們看看怎么使用同步方法。
3 線程優(yōu)先級
所有的線程都有一個優(yōu)先級,當(dāng)幾個線程正等待機(jī)會時決定應(yīng)該執(zhí)行哪個。這使得可能一個線程可以比另一個得到更多的對處理器資源的訪問。讓我們考慮一個如何使用優(yōu)先級的基本例子。假設(shè)你有一個某程序中的線程,該程序需要所有的處理器資源--某些又難又長的計(jì)算。另一些線程需要的資源相對較少。通過將需要所有資源的線程設(shè)置成低優(yōu)先級,你可以確保其他的線程可以立即執(zhí)行,而被線程約束的處理器在其他線程輪流處理之后剩下的處理周期處理該線程。
private list inTray Collections.synsnonizedl.ist(new LinkedList());
private int maxTransactions //Max transaction in the intray
注意我們從構(gòu)造函數(shù)中刪除了將inTray初始化成null的語句:現(xiàn)在我們是針對一個表,我們必須改寫Clerk類中的doTransaction方法只要表中交易數(shù)少于MaxTransactions,就向表中存儲交易。這里被修改的代碼如下:
while(inTray.size()>=maxTrarsactions)
Try
{
wail();
system.io println;
{
inTray.add)transaction);
表的size()方法返回表中包含的對象個數(shù),因此檢查這個是件無關(guān)緊要的事。我們使用add()方法在表尾添加一個新的Transaction對象。
職員調(diào)用run()方法從輸入托盤中檢索對象。因此為了處理表,我們必須更新該方法。
線程是一個程序中的子任務(wù),可以并行執(zhí)行。
【計(jì)算機(jī)二級考試JAVA基礎(chǔ)知識:線程】相關(guān)文章:
計(jì)算機(jī)二級考試java基礎(chǔ)知識10-19
計(jì)算機(jī)二級考試JAVA基礎(chǔ)知識:創(chuàng)建窗口08-17
java的多線程09-09
java多線程08-31
計(jì)算機(jī)二級考試JAVA基礎(chǔ)知識:組件和容器10-06
Java多線程的線程守護(hù)例子06-08
Java線程知識筆記09-17
java多線程介紹08-23
java線程的幾種狀態(tài)10-22