iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Software Development

十年後重讀作業系統恐龍本系列 第 14

ch4圖4.12-計算非負整數總和的Java程式

  • 分享至 

  • xImage
  •  

這段程式碼利用 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

結果:
https://ithelp.ithome.com.tw/upload/images/20240928/20168766OsSdD6v97S.png

參考:reggagne/OSC9e/ch4/Driver.java


上一篇
ch4圖4.9-使用Pthreads API 多執行緒的C程式
下一篇
ch4-OpenMP例子
系列文
十年後重讀作業系統恐龍本30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言