誰創建線程?
即使您從未顯式地創建一個新線程
您仍可能會發現自己在使用線程
線程被從各種來源中引入到我們的程序中
有許多工具可以為您創建線程
如果要使用這些工具
應該了解線程如何交互
以及如何防止線程互相干擾
AWT 和 Swing
任何使用 AWT 或 Swing 的程序都必須處理線程
AWT 工具箱創建單個線程
用於處理 UI 事件
任何由 AWT 事件調用的事件偵聽器都在 AWT 事件線程中執行
您不僅必須關心同步對事件偵聽器和其它線程之間共享的數據項的訪問
而且還必須找到一種方法
讓由事件偵聽器觸發的長時間運行任務(如在大文檔中檢查拼寫或在文件系統中搜索一個文件) 在後台線程中運行
這樣當該任務運行時
UI 就不會停滯了(這可能還會阻止用戶取消操作)
這樣做的一個好的框架示例是 SwingWorker 類
AWT 事件線程並不是守護程序線程
這就是通常使用 System
exit() 結束 AWT 和 Swing 應用程序的原因
使用 TimerTask
JDK
中
TimerTask 工具被引入到 Java 語言
這個便利的工具讓您可以稍後在某個時間執行任務(例如
即從現在起十秒後運行一次任務)
或者定期執行任務(即
每隔十秒運行任務)
實現 Timer 類非常簡單
它創建一個計時器線程
並且構建一個按執行時間排序的等待事件隊列
TimerTask 線程被標記成守護程序線程
這樣它就不會阻止程序退出
因為計時器事件是在計時器線程中執行
所以必須確保正確同步了針對計時器任務中使用的任何數據項的訪問
在 CalculatePrimes 示例中
並沒有讓主線程休眠
我們可以使用 TimerTask
方法如下
public static void main(String[] args) {
Timer timer = new Timer();
final CalculatePrimes calculator = new CalculatePrimes();
calculator
start();
timer
schedule(
new TimerTask() {
public void run()
{
calculator
finished = true;
}
}
TEN_SECONDS);
}
servlet 和 JavaServer Pages 技術
servlet 容器創建多個線程
在這些線程中執行 servlet 請求
作為 servlet 編寫者
您不知道(也不應該知道)您的請求會在什麼線程中執行
如果同時有多個對相同 URL 的請求入站
那麼同一個 servlet 可能會同時在多個線程中是活動的
當編寫 servlet 或 JavaServer Pages (JSP) 文件時
必須始終假設可以在多個線程中並發地執行同一個 servlet 或 JSP 文件
必須適當同步 servlet 或 JSP 文件訪問的任何共享數據
這包括 servlet 對象本身的字段
實現 RMI 對象
RMI 工具可以讓您調用對在其它 JVM 中運行的對象進行的操作
當調用遠程方法時
RMI 編譯器創建的 RMI 存根會打包方法參數
並通過網絡將它們發送到遠程系統
然後遠程系統會將它們解包並調用遠程方法
假設您創建了一個 RMI 對象
並將它注冊到 RMI 注冊表或者 Java 命名和目錄接口(Java Naming and Directory Interface (JNDI))名稱空間
當遠程客戶機調用其中的一個方法時
該方法會在什麼線程中執行呢?
實現 RMI 對象的常用方法是繼承 UnicastRemoteObject
在構造 UnicastRemoteObject 時
會初始化用於分派遠程方法調用的基礎結構
這包括用於接收遠程調用請求的套接字偵聽器
和一個或多個執行遠程請求的線程
所以
當接收到執行 RMI 方法的請求時
這些方法將在 RMI 管理的線程中執行
小結
線程通過幾種機制進入 Java 程序
除了用 Thread 構造器中顯式創建線程之外
還可以用許多其它機制創建線程
AWT 和 Swing
RMI
java
util
TimerTask 工具
servlet 和 JSP 技術
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27548.html