實驗存檔,代碼特別爛。。
測試.java
package operating.test; import operating.entity.bank.Bank; import operating.entity.bank.EngineeringTeam; public class TestBank { public static void main(String[] args) { Bank bank = new Bank(10); for (int i = 0; i != 3; ++i) { new Thread(new EngineeringTeam(5, bank)).start(); } } }
/
銀行.java
package operating.entity.bank; import java.util.ArrayList; public class Bank { /** * 工程隊數量 */ private static final int NUM = 3; /** * 當前可用的資金數目 */ private int available; /** * 已分配矩陣 */ private int[] allocation = new int[NUM]; /** * 需求矩陣 */ private int[] need = new int[NUM]; public Bank(int available) { this.available = available; } /** * 向銀行借錢 * @param id 工程隊id * @param request 工程隊需求資金 * @return 一個布爾值,如果借錢成功返回真,否則返回假 */ public synchronized boolean borrow(int id, int request) { System.out.println("銀行還剩 " + available + " 萬元。"); if (request <= need[id]) { if (request <= available) { int temp1 = available; int temp2 = allocation[id]; int temp3 = need[id]; // 試探借錢 available = available - request; allocation[id] = allocation[id] + request; need[id] = need[id] - request; // 安全檢查 if (check()) { System.out.println("工程隊" + id + ": 借 " + request + " 萬元成功。"); return true; } else { // 不能借,撤銷操作 available = temp1; allocation[id] = temp2; need[id] = temp3; } } } System.out.println("工程隊" + id + ": 借 " + request + " 萬元失敗。"); return false; } /** * 安全檢查 * @return 當前狀態為安全狀態返回真,否則返回假。 */ private boolean check() { int work = available; boolean[] finish = new boolean[NUM]; for (int i = 0; i != finish.length; ++i) { finish[i] = false; } for (int i = 0; i != NUM; ++i) { for (int j = 0; j != NUM; ++j) { if (!finish[j] && need[j] <= work) { work = work + allocation[j]; finish[j] = true; } } } boolean flag = true; for (int i = 0; i != NUM; ++i) { flag = flag && finish[i]; } return flag; } /** * 添加工程隊 * @param team */ public void addTeam(EngineeringTeam team) { int id = team.getId(); need[id] = team.getNeed(); } /** * 工程隊還錢 * @param money */ public void payBack(int money) { available = available + money; } }
/
借錢的工程隊.java
package operating.entity.bank; import org.omg.CORBA.INTERNAL; public class EngineeringTeam implements Runnable { /** * 工程隊總數 */ private static int total = 0; /** * 工程隊 id */ private int id; /** * 完成工程還需要的資金數量 */ private int need; /** * 目標資金 */ private int max; /** * 目標銀行 */ private Bank bank; public EngineeringTeam(int need, Bank bank) { id = total++; this.need = max = need; this.bank = bank; this.bank.addTeam(this); } public int getId() { return id; } public int getNeed() { return need; } /** * 不停借錢直到完成 */ @Override public void run() { while (need > 0) { System.out.println("工程隊" + id + ": 還缺 " + need + " 萬元。"); // 隨機借錢 int request = (int)(Math.random()*need) + 1; if (bank.borrow(id, request)) need -= request; try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } bank.payBack(max); System.out.println("【----工程隊" + id + ": 完成任務。----】"); } }