В данный момент я играю с Multi Threading в java, и я не уверен, как это работает. Мне кажется, что я понял это на простом примере, который я видел в Интернете, но каким-то образом Я не могу понять, как это работает в приложении для банковского моделирования, которое я нашел и изменил из Интернета.Многопоточное банковское моделирование
Вот что у меня есть:
Person класс: класс
package threadsproject;
public class Person {
private String name;
public Person(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
}
счета: Класс
package threadsproject;
public class Account {
public static int balance;
public static Account acc;
private static Person p;
public static int getBal(){
return balance;
}
public void setBal(int bal){
Account.balance = bal;
}
public static Account getAcc(Person p){
if(acc == null){
acc = new Account();
}
Account.p = p;
return acc;
}
public synchronized void deposit(int val){
try{
if(val > 0){
System.out.println("Person "+p.getName()+" is making a deposit.");
try{
Thread.sleep(500);
}catch(Exception e){}
balance = balance + val;
System.out.println("Person "+p.getName()+" completed the deposit.");
}else{
System.out.println("Can't deposit.");
}
System.out.println("Person "+p.getName()+" deposited "+val);
}catch(Exception e){}
}
public synchronized void withdraw(int val){
try{
if(balance >= val){
System.out.println("Person "+p.getName()+" is making a withdraw.");
try{
Thread.sleep(500);
}catch(Exception e){}
balance = balance - val;
System.out.println("Person "+p.getName()+" completed the withdraw.");
}else{
System.out.println("Can't withdraw.");
}
System.out.println("Person "+p.getName()+" withdrew "+val);
}catch(Exception e){}
}
}
темы:
package threadsproject;
import java.util.Scanner;
public class BankThread extends Thread implements Runnable{
private Person p;
public BankThread(Person p){
this.p = p;
}
public void run(){
for (int i = 0; i < 3; i++) {
try {
Account acc = Account.getAcc(p);
Scanner s = new Scanner(System.in);
System.out.println("Enter deposit ammount:");
int dep = s.nextInt();
acc.deposit(dep);
try {
Thread.sleep(500);
} catch (InterruptedException ex) { }
System.out.println("Enter withdrawal ammount:");
int with = s.nextInt();
if(with > Account.getBal()){
System.out.println("You don't have enough funds.");
}else{
acc.withdraw(with);
}
System.out.println("Final balance: "+Account.getBal());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Person p1 = new Person("Person1");
Person p2 = new Person("Person2");
Person p3 = new Person("Person3");
BankThread bt1 = new BankThread(p1);
bt1.start();
bt1.join();
BankThread bt2 = new BankThread(p2);
bt2.start();
bt2.join();
BankThread bt3 = new BankThread(p3);
bt3.start();
bt3.join();
}
}
Как я уже говорил, это пример Я нашел и dified. Я думаю, это работает, но не правильно. В классе потоков цикл for проходит и выполняет код для каждого потока 3 раза. И еще одна проблема заключается в том, что баланс аккаунта остается неизменным для каждого потока. Итак, если у меня есть 100 окончательного баланса для моего первого потока, второй начинается с того же самого, с 100 балансом, а не с 0. Если у меня разные объекты, он должен начинаться с 0 правильно?
Вот скриншот.
Не знаете, где вы нашли этот класс 'Account', но выбрасываете ссылку на книгу или сайт, где вы это делали, потому что это мусор. У вас есть класс «Лицо» с хорошими нестатическими полями, поэтому вы можете создать более одного объекта «Личность» для своего банка. Но тогда у вас есть класс 'Account' со всеми полями' static', что означает, что в вашей системе может быть только одна учетная запись. Что хорошего в банке с одним аккаунтом? Полное неправильное использование 'static'. Сожги это!!! – Andreas