wait()
notify() 和 notifyAll() 方法
除了使用輪詢(它可能消耗大量 CPU 資源
而且具有計時不精確的特征)
Object 類還包括一些方法
可以讓線程相互通知事件的發生
Object 類定義了 wait()
notify() 和 notifyAll() 方法
要執行這些方法
必須擁有相關對象的鎖
Wait() 會讓調用線程休眠
直到用 Thread
interrupt() 中斷它
過了指定的時間
或者另一個線程用 notify() 或 notifyAll() 喚醒它
當對某個對象調用 notify() 時
如果有任何線程正在通過 wait() 等待該對象
那麼就會喚醒其中一個線程
當對某個對象調用 notifyAll() 時
會喚醒所有正在等待該對象的線程
這些方法是更復雜的鎖定
排隊和並發性代碼的構件
但是
notify() 和 notifyAll() 的使用很復雜
尤其是
使用 notify() 來代替 notifyAll() 是有風險的
除非您確實知道正在做什麼
否則就使用 notifyAll()
與其使用 wait() 和 notify() 來編寫您自己的調度程序
線程池
隊列和鎖
倒不如使用 ncurrent 包(請參閱參考資料)
這是一個被廣泛使用的開放源碼工具箱
裡面都是有用的並發性實用程序
JDK
將包括 ncurrent 包
它的許多類都派生自 ncurrent
線程優先級
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()
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27556.html