阿摩線上測驗 登入

申論題資訊

試卷:101年 - 101年專門職業及技術人員高等建築師、技師、第二次食品技師暨普通不動產經紀人、記帳士考高等_資訊技師#29309
科目:程式設計
年份:101年
排序:0

申論題內容

一、假設一公司有甲、乙及丙三個廠區,生產四種產品:高端、先進、突破及創新,現 在要同時間統計三個廠區四種產品的總庫存量,為求效率,請以多工執行緒的方式 實作並請留意資料同步問題。為簡化程式,廠區內各個產品的庫存量可以亂數產生 的方式來取代其真實的查詢過程。(30 分)

詳解 (共 1 筆)

詳解 提供者:hchungw
為了同時統計三個廠區四種產品的總庫存量並考慮到資料同步問題,我們可以使用Java語言來實作一個多執行緒的程式。這個程式將包含一個共享資源(庫存量統計),多個執行緒同時更新這個共享資源時,必須確保資料的一致性和同步。
以下是一個簡化的實作範例,使用ReentrantLock來處理資料同步問題,以確保在更新總庫存量時,不會發生資料不一致的問題。
java

import java.util.Random;
import java.util.concurrent.locks.ReentrantLock;
public class InventoryCounter {
    private static final int NUMBER_OF_PRODUCTS = 4;
    private int[] totalInventory = new int[NUMBER_OF_PRODUCTS]; // 索引對應到四種產品的庫存量
    private ReentrantLock lock = new ReentrantLock();
    public void addInventory(int productType, int quantity) {
        lock.lock(); // 鎖定資源
        try {
            totalInventory[productType] += quantity;
        } finally {
            lock.unlock(); // 釋放資源
        }
    }
    public void printInventory() {
        for (int i = 0; i < NUMBER_OF_PRODUCTS; i++) {
            System.out.println("Product " + i + ": " + totalInventory[i]);
        }
    }
    public static void main(String[] args) {
        InventoryCounter counter = new InventoryCounter();
        // 甲、乙、丙三個廠區
        Thread factoryA = new Thread(() -> {
            Random random = new Random();
            for (int i = 0; i < NUMBER_OF_PRODUCTS; i++) {
                counter.addInventory(i, random.nextInt(100)); // 假設庫存量為0到99的隨機數
            }
        });
        Thread factoryB = new Thread(() -> {
            Random random = new Random();
            for (int i = 0; i < NUMBER_OF_PRODUCTS; i++) {
                counter.addInventory(i, random.nextInt(100));
            }
        });
        Thread factoryC = new Thread(() -> {
            Random random = new Random();
            for (int i = 0; i < NUMBER_OF_PRODUCTS; i++) {
                counter.addInventory(i, random.nextInt(100));
            }
        });
        // 啟動執行緒
        factoryA.start();
        factoryB.start();
        factoryC.start();
        // 等待所有執行緒完成
        try {
            factoryA.join();
            factoryB.join();
            factoryC.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 打印最終庫存量
        counter.printInventory();
    }
}
這個程式首先定義了一個InventoryCounter類,這個類包含了一個庫存量數組totalInventory,每個索引對應一種產品的庫存量。addInventory方法用於增加特定產品的庫存量,這個方法是同步的,使用了ReentrantLock來確保當多個執行緒同時試圖更新庫存量時,不會發生資料競爭的問題。
main方法創建了三個執行緒,分別代表三個廠區,每個執行緒隨機增加四種產品的庫存量。所有執行緒啟動後,主執行緒會等待它們完成,最後打印出每種產品的總庫存量。