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

Java:無處不在的線程

編輯:關於JAVA

誰創建線程?

即使您從未顯式地創建一個新線程,您仍可能會發現自己在使用線程。線程被從各種來源中引入到我們的程序中。

有許多工具可以為您創建線程,如果要使用這些工具,應該了解線程如何交互,以及如何防止線程互相干擾。

AWT 和 Swing

任何使用 AWT 或 Swing 的程序都必須處理線程。AWT 工具箱創建單個線程,用於處理 UI 事件,任何由 AWT 事件調用的事件偵聽器都在 AWT 事件線程中執行。

您不僅必須關心同步對事件偵聽器和其它線程之間共享的數據項的訪問,而且還必須找到一種方法,讓由事件偵聽器觸發的長時間運行任務(如在大文檔中檢查拼寫或在文件系統中搜索一個文件) 在後台線程中運行,這樣當該任務運行時,UI 就不會停滯了(這可能還會阻止用戶取消操作)。這樣做的一個好的框架示例是 SwingWorker 類(請參閱參考資料)。

AWT 事件線程並不是守護程序線程;這就是通常使用 System.exit() 結束 AWT 和 Swing 應用程序的原因。

使用 TimerTask

JDK 1.3 中,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 技術

小結

線程通過幾種機制進入 Java 程序。除了用 Thread 構造器中顯式創建線程之外,還可以用許多其它機制創建線程:

AWT 和 Swing

RMI

java.util.TimerTask 工具

servlet 和 JSP 技術

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