Java 程式中的多執行緒
Java 程式中的多執行緒[@more@] 在Java程式中使用多執行緒要比在 C 或 C++ 中容易得多,這是因為 Java 程式語言提供了語言級的支援。本文透過簡單的程式設計示例來說明 Java 程式中的多執行緒是多麼直觀。讀完本文以後,使用者應該能夠編寫簡單的多執行緒程式。
為什麼會排隊等待?
下面的這個簡單的 Java 程式完成四項不相關的任務。這樣的程式有單個控制執行緒,控制在這四個任務之間線性地移動。此外,因為所需的資源 — 印表機、磁碟、資料庫和螢幕 -- 由於硬體和軟體的限制都有內在的潛伏時間,所以每項任務都包含明顯的等待時間。因此,程式在訪問資料庫之前必須等待印表機完成列印檔案的任務,等等。如果您正在等待程式的完成,則這是對計算資源和您的時間的一種拙劣使用。改進此程式的一種方法是使它成為多執行緒的。
四項不相關的任務
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() 函式來完成有用的工作。使用者並不直接呼叫此函式;而是必須呼叫 Thread 的 start() 函式,該函式再呼叫 run()。下面的程式碼說明了它的用法:
建立兩個新執行緒
import java.util.*;
class TimePrinter extends Thread {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}
public void run() {
while(true) {
try {
System.out.println(name + ":" + new
Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch(Exception e) {
System.out.println(e);
}
}
}
static public void main(String args[]) {
TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
tp1.start();
TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
tp2.start();
}
}
在本例中,我們可以看到一個簡單的程式,它按兩個不同的時間間隔(1 秒和 3 秒)在螢幕上顯示當前時間。這是透過建立兩個新執行緒來完成的,包括 main() 共三個執行緒。但是,因為有時要作為執行緒執行的類可能已經是某個類層次的一部分,所以就不能再按這種機制建立執行緒。雖然在同一個類中可以實現任意數量的介面,但 Java 程式語言只允許一個類有一個父類。同時,某些程式設計師避免從 Thread 類匯出,因為它強加了類層次。對於這種情況,就要 runnable 介面。
為什麼會排隊等待?
下面的這個簡單的 Java 程式完成四項不相關的任務。這樣的程式有單個控制執行緒,控制在這四個任務之間線性地移動。此外,因為所需的資源 — 印表機、磁碟、資料庫和螢幕 -- 由於硬體和軟體的限制都有內在的潛伏時間,所以每項任務都包含明顯的等待時間。因此,程式在訪問資料庫之前必須等待印表機完成列印檔案的任務,等等。如果您正在等待程式的完成,則這是對計算資源和您的時間的一種拙劣使用。改進此程式的一種方法是使它成為多執行緒的。
四項不相關的任務
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() 函式來完成有用的工作。使用者並不直接呼叫此函式;而是必須呼叫 Thread 的 start() 函式,該函式再呼叫 run()。下面的程式碼說明了它的用法:
建立兩個新執行緒
import java.util.*;
class TimePrinter extends Thread {
int pauseTime;
String name;
public TimePrinter(int x, String n) {
pauseTime = x;
name = n;
}
public void run() {
while(true) {
try {
System.out.println(name + ":" + new
Date(System.currentTimeMillis()));
Thread.sleep(pauseTime);
} catch(Exception e) {
System.out.println(e);
}
}
}
static public void main(String args[]) {
TimePrinter tp1 = new TimePrinter(1000, "Fast Guy");
tp1.start();
TimePrinter tp2 = new TimePrinter(3000, "Slow Guy");
tp2.start();
}
}
在本例中,我們可以看到一個簡單的程式,它按兩個不同的時間間隔(1 秒和 3 秒)在螢幕上顯示當前時間。這是透過建立兩個新執行緒來完成的,包括 main() 共三個執行緒。但是,因為有時要作為執行緒執行的類可能已經是某個類層次的一部分,所以就不能再按這種機制建立執行緒。雖然在同一個類中可以實現任意數量的介面,但 Java 程式語言只允許一個類有一個父類。同時,某些程式設計師避免從 Thread 類匯出,因為它強加了類層次。對於這種情況,就要 runnable 介面。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10901326/viewspace-965639/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 程式設計思想之多執行緒與多程式(3):Java 中的多執行緒程式設計執行緒Java
- Java程式中的多執行緒(1)(轉)Java執行緒
- Java程式中的多執行緒(2)(轉)Java執行緒
- Java中的多執行緒Java執行緒
- Java中多執行緒的案例Java執行緒
- Java多執行緒1:程式與執行緒概述Java執行緒
- Java多執行緒——執行緒Java執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- Java中的多執行緒詳解Java執行緒
- Android中的多程式、多執行緒Android執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- java 多執行緒 程式保護Java執行緒
- Java多執行緒-程式執行堆疊分析Java執行緒
- java多執行緒程式設計:你真的瞭解執行緒中斷嗎?Java執行緒程式設計
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- java——多執行緒Java執行緒
- java 多執行緒Java執行緒
- 【Java】多執行緒Java執行緒
- JAVA 多執行緒 ??Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒