為了同時統計三個廠區四種產品的總庫存量並考慮到資料同步問題,我們可以使用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方法創建了三個執行緒,分別代表三個廠區,每個執行緒隨機增加四種產品的庫存量。所有執行緒啟動後,主執行緒會等待它們完成,最後打印出每種產品的總庫存量。