我正在嘗試使用多線程來模擬單個銀行帳戶上的兩個用戶,提取和存款。我希望兩位用戶能夠使用一個共享變量,當然這代表了賬戶餘額。關於多線程訪問和編輯全局字段
存款或取款的操作是隨機選取的 - 1或2(分別存入和取出)。存款時,我要求存款操作需要1秒,撤回操作需要0.5秒。在這個時間間隔內,線程必須等待另一個線程完成一個動作,然後才能撤回/存放它自己。
然而,我最大的問題是兩個線程如何編輯單個共享數字字段,即餘額。我第一次嘗試時,每個線程都創建了自己的平衡實例,並分別對它們執行操作。我希望每個線程的行動(撤回/存款)影響全球領域的「平衡」 - 而不是實例領域。
線程類和驅動程序類我到目前爲止列出如下。
主題Creator類:
public class BankAccountSim extends Thread{
public double balance = 1000;
public String threadName;
BankAccountSim(String name){
threadName = name;
}
public void run(){
System.out.println(threadName + "account initiated.");
while(true){
try{
Random rand = new Random();
int num = rand.nextInt(2) + 1;
if(num == 1){
System.out.println(threadName + " is depositing in the bank.");
balance += 1;
System.out.println("The new balance is " + balance + " dollars");
Thread.sleep(1000);
Thread.yield();
}
else{
System.out.println(threadName + " is withdrawing from the bank.");
balance -= 1;
System.out.println("The new balance is " + balance + " dollars.");
Thread.sleep(500);
Thread.yield();
}
}
catch(InterruptedException e){
System.out.println("Process terminated.");
}
}
}
}
主題Driver類:
import java.util.concurrent.ThreadLocalRandom;
import java.util.Random;
public class BankAccountSimDriver {
public static void main(String[] args){
Thread user1 = new BankAccountSim("user1");
Thread user2 = new BankAccountSim("user2");
user1.start();
user2.start();
}
}
您可以使'balance'靜態,甚至可以使用AtomicInteger –
而不是使'BankAccountSim'從'Thread'擴展,只需將其設置爲一個簡單的類。創建此類的單個實例,然後將其傳遞給線程,然後線程應該對其執行操作。 'BankAccountSim'應該提供'同步'的方法'撤回'或'存入'賬戶 – MadProgrammer
,如果你真的想要使用這個代碼,那麼金錢不應該是一個'雙' –