【发布时间】:2018-01-16 14:07:46
【问题描述】:
对于我目前的 uni 课程作业,我打算创建一个 Java 控制台应用程序来模拟创建最多 4 个用户可以同时访问的共享银行帐户。借助我在网上找到的所有资源和其他多线程应用程序,我能够连接我当前的代码。
这是一种心态 - 每个用户都应该可以平等地访问银行账户,而不会出现延迟、死锁、等待等情况。执行的每笔交易(取款和存款)都应该更新到银行余额并记录下来。为每个用户执行的特定事务存储在数组列表中。
我将制作应用程序的非同步版本和同步版本。我通过创建 4 个类来解决这个问题 - BankAccount(银行账户)、BankTester(运行主应用程序的测试器类)、User(用户)和 UserThread(用户的线程类)。
我现在拥有的是应用程序的非同步版本。关于如何同步(并改进此非同步版本)的任何帮助都会对我现在对多线程有所帮助。谢谢大家。
这是我的代码。
BankAccount 类:
public class BankAccount {
private long accountNo;
private double accountBalance;
public BankAccount() {
this.accountNo = 9876543210L;
this.accountBalance = 1980;
}
public void getAccountInfo() {
System.out.println("Account Number: " + accountNo);
System.out.println("Starting Account Balance: " + accountBalance);
}
public void getAccountBalance() {
System.out.println("Account Balance: " + accountBalance);
}
public void deposit(double value) {
accountBalance = (accountBalance + value);
System.out.println("Account Balance After Deposit: " + accountBalance);
}
public void withdraw(double value) {
accountBalance = (accountBalance + value);
System.out.println("Account Balance After Withdrawal: " + accountBalance);
}
}
BankTest 类:
import java.util.Scanner;
public class BankTest {
private static double[][] transactionList = {
{50, 10, -20, 10, -20, 20, 10, 50, -10, 10, -10, 50},
{20, 20, -20, 50, -20, 10, 50, 50, -20, 10, 10},
{50, 10, 10, -10, -10, 50, 20, -10, -20},
{50, 10, -20, 20, 10, -20}
};
private static BankAccount myAccount;
private static UserThread myUser1;
private static UserThread myUser2;
private static UserThread myUser3;
private static UserThread myUser4;
public static void main(String[] args) {
for (;;) {
System.out.println("<--------- Banking Menu ----------->");
System.out.println("1. Create Bank Account");
System.out.println("2. Create User");
System.out.println("3. Run Simulation");
System.out.println("4. Exit");
System.out.println("Enter choice: ");
Scanner in = new Scanner(System.in);
switch (in.nextInt()) {
case 1:
System.out.println("<--------- Create Bank Account ----------->");
myAccount = new BankAccount();
System.out.println("Bank Account Created!");
break;
case 2:
System.out.println("<--------- Create User ----------->");
System.out.println("1. User 1");
System.out.println("2. User 2");
System.out.println("3. User 3");
System.out.println("4. User 4");
userMenu();
break;
case 3:
myUser1.start();
myUser2.start();
myUser3.start();
myUser4.start();
break;
case 4:
System.out.println("Goodbye");
System.exit(0);
break;
default:
System.err.println("Unrecognized option");
break;
}
}
}
public static void userMenu() {
Scanner in = new Scanner(System.in);
switch (in.nextInt()) {
case 1:
System.out.println("<----- User 1 ------>");
User user1 = new User("Saul", "Goodman", myAccount, transactionList[0]);
myUser1 = new UserThread(user1, "User 1 Thread");
user1.getUserInfo();
break;
case 2:
System.out.println("<-------- User 2 ------->");
User user2 = new User("Walter", "White", myAccount, transactionList[1]);
myUser2 = new UserThread(user2, "User 2 Thread");
user2.getUserInfo();
break;
case 3:
System.out.println("<-------- User 3 ------->");
User user3 = new User("Jessie", "Pinkman", myAccount, transactionList[2]);
myUser3 = new UserThread(user3, "User 3 Thread");
user3.getUserInfo();
break;
case 4:
System.out.println("<-------- User 4 ------->");
User user4 = new User("Hank", "Schrader", myAccount, transactionList[3]);
myUser4 = new UserThread(user4, "User 4 Thread");
user4.getUserInfo();
break;
default:
System.err.println("Unrecognized option");
break;
}
}
public static void runSimulation(User u) {
double[] tList = u.getTransactionList();
BankAccount ba = u.getBankAccount();
for (int i = 0; i < tList.length; i++){
if(tList[i] < 0) {
ba.withdraw(tList[i]);
} else{
ba.deposit(tList[i]);
}
u.getName();
ba.getAccountBalance();
}
}
}
用户类别:
public class User {
private String name;
private String surname;
private BankAccount bankAccount;
private double[] transactionList;
public User(String n, String s, BankAccount bA, double[] tL) {
this.name = n;
this.surname = s;
this.bankAccount = bA;
this.transactionList = tL;
}
public void getName() {
System.out.println("Name: " + this.name);
}
public double[] getTransactionList(){
return transactionList;
}
public void getSurname() {
System.out.println("Surname: " + this.surname);
}
public void getUserInfo() {
System.out.println("Full name: " + this.name + " " + this.surname);
}
public BankAccount getBankAccount() {
return bankAccount;
}
}
UserThread 类:
public class UserThread extends Thread {
private User u;
public UserThread(User u, String name) {
super(name);
this.u = u;
}
@Override
public void run() {
BankTest.runSimulation(this.u);
}
}
【问题讨论】:
-
所以你想让我问一个具体的问题吗?
标签: java multithreading synchronization thread-synchronization