計算機二級考試JAVA基礎知識:線程

來源:文萃谷 1.92W

 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()方法從輸入托盤中檢索對象。因此為了處理表,我們必須更新該方法。

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

熱門標籤