為什麼會排隊等待?
下面的這個簡單的 Java 程序完成四項不相關的任務。這樣的程序有單個控制線程,控制在這四個任務之間線性地移動。
<!-- frame contents -->
<!-- /frame contents -->
此外,因為所需的資源 — 打印機、磁盤、數據庫和顯示屏 -- 由於硬件和軟件的限制都有內在的潛伏時間,所以每項任務都包含明顯的等待時間。因此,程序在訪問數據庫之前必須等待打印機完成打印文件的任務,等等。假如您正在等待程序的完成,則這是對計算資源和您的時間的一種拙劣使用。改進此程序的一種方法是使它成為多線程的。
四項不相關的任務 class myclass {
static public void main(String args[]) {
print_a_file();
manipulate_another_file();
Access_database();
draw_picture_on_screen();
}
}
在本例中,每項任務在開始之前必須等待前一項任務完成,即使所涉及的任務毫不相關也是這樣。但是,在現實生活中,我們經常使用多線程模型。我們在處理某些任務的同時也可以讓孩子、配偶和父母完成別的任務。例如,我在寫信的同時可能打發我的兒子去郵局買郵票。用軟件術語來說,這稱為多個控制(或執行)線程。
可以用兩種不同的方法來獲得多個控制線程:
多個進程
在大多數操作系統中都可以創建多個進程。當一個程序啟動時,它可以為即將開始的每項任務創建一個進程,並答應它們同時運行。當一個程序因等待網絡訪問或用戶輸入而被阻塞時,另一個程序還可以運行,這樣就增加了資源利用率。但是,按照這種方式創建每個進程要付出一定的代價:設置一個進程要占用相當一部分處理器時間和內存資源。而且,大多數操作系統不答應進程訪問其他進程的內存空間。因此,進程間的通信很不方便,並且也不會將它自己提供給輕易的編程模型。
線程
線程也稱為輕型進程 (LWP)。因為線程只能在單個進程的作用域內活動,所以創建線程比創建進程要廉價得多。這樣,因為線程答應協作和數據交換,並且在計算資源方面非常廉價,所以線程比進程更可取。線程需要操作系統的支持,因此不是所有的機器都提供線程。Java 編程語言,作為相當新的一種語言,已將線程支持與語言本身合為一體,這樣就對線程提供了強健的支持。
使用 Java 編程語言實現線程
Java 編程語言使多線程如此簡單有效,以致於某些程序員說它實際上是自然的。盡管在 Java 中使用線程比在其他語言中要輕易得多,仍然有一些概念需要把握。要記住的一件重要的事情是 main() 函數也是一個線程,並可用來做有用的工作。程序員只有在需要多個線程時才需要創建新的線程。
Thread 類
Thread 類是一個具體的類,即不是抽象類,該類封裝了線程的行為。要創建一個線程,程序員必須創建一個從 Thread 類導出的新類。程序員必須覆蓋 Thread 的 run() 函數來完成有用的工作。
<!-- frame contents -->
<!-- /frame contents -->
用戶並不直接調用此函數;而是必須調用 Thread 的 start() 函數,該函數再調用 run()。下面的代碼說明了它的用法:
創建兩個新線程 import java.util.*;
class TimePrinter extends Thread {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}