程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java:其他線程AIP詳細信息

Java:其他線程AIP詳細信息

編輯:關於JAVA

wait()、notify() 和 notifyAll() 方法

除了使用輪詢(它可能消耗大量 CPU 資源,而且具有計時不精確的特征),Object 類還包括一些方法,可以讓線程相互通知事件的發生。

Object 類定義了 wait()、notify() 和 notifyAll() 方法。要執行這些方法,必須擁有相關對象的鎖。

Wait() 會讓調用線程休眠,直到用 Thread.interrupt() 中斷它、過了指定的時間、或者另一個線程用 notify() 或 notifyAll() 喚醒它。

當對某個對象調用 notify() 時,如果有任何線程正在通過 wait() 等待該對象,那麼就會喚醒其中一個線程。當對某個對象調用 notifyAll() 時,會喚醒所有正在等待該對象的線程。

這些方法是更復雜的鎖定、排隊和並發性代碼的構件。但是,notify() 和 notifyAll() 的使用很復雜。尤其是,使用 notify() 來代替 notifyAll() 是有風險的。除非您確實知道正在做什麼,否則就使用 notifyAll()。

與其使用 wait() 和 notify() 來編寫您自己的調度程序、線程池、隊列和鎖,倒不如使用 util.concurrent 包(請參閱參考資料),這是一個被廣泛使用的開放源碼工具箱,裡面都是有用的並發性實用程序。JDK 1.5 將包括 java.util.concurrent 包;它的許多類都派生自 util.concurrent。

線程優先級

Thread API 讓您可以將執行優先級與每個線程關聯起來。但是,這些優先級如何映射到底層操作系統調度程序取決於實現。在某些實現中,多個 ― 甚至全部 ― 優先級可能被映射成相同的底層操作系統優先級。

在遇到諸如死鎖、資源匮乏或其它意外的調度特征問題時,許多人都想要調整線程優先級。但是,通常這樣只會把問題移到別的地方。大多數程序應該完全避免更改線程優先級。

線程組

ThreadGroup 類原本旨在用於把線程集合構造成組。但是,結果證明 ThreadGroup 並沒有那樣有用。您最好只使用 Thread 中的等價方法。

ThreadGroup 確實提供了一個有用的功能部件(Thread 中目前還沒有):uncaughtException() 方法。線程組中的某個線程由於拋出了未捕獲的異常而退出時,會調用 ThreadGroup.uncaughtException() 方法。這就讓您有機會關閉系統、將一條消息寫到日志文件或者重新啟動失敗的服務。

SwingUtilities

雖然 SwingUtilities 類不是 Thread API 的一部分,但還是值得簡單提一下。

正如前面提到的,Swing 應用程序有一個 UI 線程(有時叫稱為事件線程),所有 UI 活動都必須在這個線程中發生。有時,另一個線程也許想要更新屏幕上某樣東西的外觀,或者觸發 Swing 對象上的一個事件。

SwingUtilities.invokeLater() 方法可以讓您將 Runnable 對象傳送給它,並且在事件線程中執行指定的 Runnable。它的同類 invokeAndWait() 會在事件線程中調用 Runnable,但 invokeAndWait() 會阻塞,直到 Runnable 完成執行之後。

void showHelloThereDialog() throws Exception {
  Runnable showModalDialog = new Runnable() {
    public void run() {
      JOptionPane.showMessageDialog(myMainFrame, "Hello There");
    }
  };
  SwingUtilities.invokeLater(showModalDialog);
}

對於 AWT 應用程序,java.awt.EventQueue 還提供了 invokeLater() 和 invokeAndWait()。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved