從上述代碼可以看出:該類實現了Runnable接口并且在該類中定義了run方法。這種多線程應用程序的實現方式與繼承Thread類的多線程應用程序的重要區別在于啟動多線程對象的方法設計方法不同。在上述代碼中,通過創建Thread對象實例并且將應用對象作為創建Thread類實例的參數。
四、線程間的同步
Java應用程序的多個線程共享同一進程的數據資源,多個用戶線程在并發運行過程中可能同時訪問具有敏感性的內容。在Java中定義了線程同步的概念,實 現對共享資源的一致性維護。下面以筆者最近開發的移動通信計費系統中線程間同步控制方法,說明Java語言中多線程同步方式的實現過程。
在沒有多線程同步控制策略條件下的客戶賬戶類定義框架代碼如下所示:
public class RegisterAccount
{
float fBalance;
//客戶繳費方法
public void deposit(float fFees){ fBalance += fFees; }
//通話計費方法
public void withdraw(float fFees){ fBalance -= fFees; }
… …
}
讀者也許會認為:上述程序代碼完全能夠滿足計費系統實際的需要。確實,在單線程環境下該程序確實是可靠的。但是,多進程并發運行的情況是怎樣的呢?假設發 生這種情況:客戶在客戶服務中心進行繳費的同時正在利用移動通信設備僅此通話,客戶通話結束時計費系統啟動計費進程,而同時服務中心的工作人員也提交繳費 進程運行。讀者可以看到如果發生這種情況,對客戶賬戶的處理是不嚴肅的。
如何解決這種問題呢?很簡單,在RegisterAccount類方法定義中加上用于標識同步方法的關鍵字synchronized。這樣,在同步方法執 行過程中該方法涉及的共享資源(在上述代碼中為fBalance成員變量)將被加上共享鎖,以確保在方法運行期間只有該方法能夠對共享資源進行訪問,直到 該方法的線程運行結束打開共享鎖,其它線程才能夠訪問這些共享資源。在共享鎖沒有打開的時候其它訪問共享資源的線程處于阻塞狀態。
進行線程同步策略控制后的RegisterAccount類定義如下面代碼所示:
public class RegisterAccount
文章來源于領測軟件測試網 http://www.kjueaiud.com/