當前位置:才華齋>計算機>計算機二級>

計算機二級考試JAVA基礎知識:執行緒

計算機二級 閱讀(2W)

 1 理解執行緒

計算機二級考試JAVA基礎知識:執行緒

許多程式,無論大小,都包含或多或少獨立於其他段的程式碼段,如果程式碼段可以在時間上並行執行效率會更高。執行緒提供了這種方法。當然,如果像大多數人一樣,你的計算機只有一個處理器,對任意時刻,你不能執行多於一個的計算,但你可以並行地處理輸入/輸出操作。使用執行緒的另一個原因是在需要連續執行的程式中允許同時處理程式中其他的活動,例如,在同一個程式中一個連續執行的動畫與另一個活動並行。在web頁中 Java的小應用程式在你的瀏覽器控制下執行,執行緒使多個小應用程式可以同時一執行。在這種情況下,執行緒將在瀏覽器控制下執行的程式分成段以便它好及時執行。如果你只有一個處理器,你的作業系統會造成一個錯覺,由於在任意一個給定的時刻只有一個執行緒可以執行指令,但這是一個非常有效的錯覺。為了產生動畫,你可以將繪製一系列靜止畫面的程式碼放入一個迴圈中:

通常繪製圖像的程式碼在計時器的控制一下執行,因此是在一個固定的速率下執行,比方說每秒20次。當然,當迴圈執行時同一個執行緒中不會發生其他的事。如果你想有另一個執行的動畫,它必須在一個獨立的執行緒中。然後你的作業系統多工的能力允許兩個執行緒分一享有效的處理器時間,因此,允許兩個動畫的執行。在第16章我們將研究如何編寫動畫程式。

 2 管理執行緒

在這章的兩個例子中我們看到,執行緒被啟動,然後競爭計算機資源。因為三個執行緒對處理器的竟爭採用不受控制的方法,所以執行緒的輸出次序混亂。在程式中通常這是不希望看到的。在絕大多數使用執行緒的例子中,執行緒執行的方法需要被管理才能使執行緒彼此不產生衝突。

當然,在我們的例子中,程式被故意構造成通過輸出一個名字中途釋放處理器的控制。

雖然這是非常做作的,但類似情況也會在現實中出現,特別是在重複操作的執行緒中出現。能夠認識到當一個原始語句執行時一個執行緒能被中斷是很重要的'。例如:假設一個執行緒執行語句:

i=i+1

在這個語句仍在執行時,執行緒的執行被中斷是極有可能的,也許存i值被取來增1之後,但在結果被存回i之前。沒有適當控制,另一個訪問i的執行緒會在這一時刻改變i的值:結果是在這個執行緒中i沒有增1.

兩個或多個執行緒分享一個公用資源的地方,如檔案或記憶體塊,你需要決策確保一個執行緒不能修改另一個執行緒正在使用的資源。當一木執行緒更新檔案中的一個記錄時而另一個執行緒中途檢索同一個記錄是帶來災難的方法。管理這種情況的一個方法是使用執行緒中包含的同步(synchronization)

同步

同步的目標是當幾個執行緒想訪問同一個資源時,確保在仟何指定時刻只能有一個執行緒訪問它。用同步管理你的執行緒執行有兩種方法;

在方法一級管理程式碼,包括同步方法

在塊一級管理程式碼一使用同步塊

首先我們看看怎麼使用同步方法。

 3 執行緒優先順序

所有的執行緒都有一個優先順序,當幾個執行緒正等待機會時決定應該執行哪個。這使得可能一個執行緒可以比另一個得到更多的對處理器資源的訪問。讓我們考慮一個如何使用優先順序的基本例子。假設你有一個某程式中的執行緒,該程式需要所有的處理器資源--某些又難又長的計算。另一些執行緒需要的資源相對較少。通過將需要所有資源的執行緒設定成低優先順序,你可以確保其他的執行緒可以立即執行,而被執行緒約束的處理器在其他執行緒輪流處理之後剩下的處理週期處理該執行緒。

private list inTray (new LinkedList());

private int maxTransactions //Max transaction in the intray

注意我們從建構函式中刪除了將inTray初始化成null的語句:現在我們是針對一個表,我們必須改寫Clerk類中的doTransaction方法只要表中交易數少於MaxTransactions,就向表中儲存交易。這裡被修改的程式碼如下:

while(()>=maxTrarsactions)

Try

{

wail();

println;

{

)transaction);

表的size()方法返回表中包含的物件個數,因此檢查這個是件無關緊要的事。我們使用add()方法在表尾新增一個新的Transaction物件。

職員呼叫run()方法從輸入托盤中檢索物件。因此為了處理表,我們必須更新該方法。

執行緒是一個程式中的子任務,可以並行執行。