現時点では、私はマルチスレッド化を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;
}
}
Accountクラス:
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){}
}
}
Threadクラス:
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();
}
}
私が述べたように、それは例です私は見つけた異なる。これは動作しますが、正しくはありません。スレッドクラスでは、forループが各スレッドのコードを3回実行します。 もう1つの問題は、アカウントの残高がスレッドごとに変わらないことです。だから、私の最初のスレッドのための100の最終残高がある場合、2番目のものは、0からではなく100のバランスで開始します。 私は別のオブジェクトを持っている場合、それは0から始まるでしょうか?
ここにスクリーンショットがあります。
「Account」クラスはどこにあるのか分かりませんが、ガベージであるため、行った本やウェブサイトのリンクを捨てます。良い非静的フィールドを持つ 'Person'クラスがありますので、あなたの銀行のために複数の' Person'オブジェクトを作成することができます。しかし、すべての 'static'フィールドを持つ' Account'クラスがあります。これはあなたのシステムに 'Account'しかないことを意味します。最大で1つの口座を持つ銀行は何ですか? 「静的」の総誤使用。それを燃やす!!! – Andreas