這段程式碼利用 Java 的多線程特性來計算總和,展示了如何使用 Runnable 接口來實現線程的創建和管理。這樣的設計使得計算過程不會阻塞主線程,並且能夠有效地處理計算任務。
Driver.java
/**
* This program creates a separate thread by implementing the Runnable interface.
*
* Figure 4.12
*
* @author Gagne, Galvin, Silberschatz
* Operating System Concepts - Ninth Edition
* Copyright John Wiley & Sons - 2013
*/
/* 用於存儲計算的總和,包含 get() 和 set(int sum) 方法來訪問和修改 sum 的值 */
class Sum
{
private int sum;
public int get() {
return sum;
}
public void set(int sum) {
this.sum = sum;
}
}
/* 使用 Java 的 Runnable 接口來創建和運行一個新線程 */
class Summation implements Runnable
{
private int upper;
private Sum sumValue;
public Summation(int upper, Sum sumValue) {
if (upper < 0)
throw new IllegalArgumentException();
this.upper = upper;
this.sumValue = sumValue;
}
public void run() {
int sum = 0;
for (int i = 0; i <= upper; i++)
sum += i;
sumValue.set(sum);
}
}
/*
主程式,負責處理命令行參數和啟動線程。
檢查輸入參數的數量,然後將其轉換為整數。
創建 Summation 實例。
調用 start() 方法啟動線程。
使用 join() 方法等待子線程完成,然後輸出計算結果。
*/
public class Driver
{
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Usage Driver <integer>");
System.exit(0);
}
Sum sumObject = new Sum();
int upper = Integer.parseInt(args[0]);
Thread worker = new Thread(new Summation(upper, sumObject));
worker.start();
try {
worker.join();
} catch (InterruptedException ie) { }
System.out.println("The sum of " + upper + " is " + sumObject.get());
}
}
Terminal
編譯並執行
javac Driver.java
java Driver 10
結果:
參考:reggagne/OSC9e/ch4/Driver.java