1. Java クラスの作成
ここでは 3 つの Java クラスが作成され、最初の Account クラスはアカウント内の各項目をカプセル化するために使用されます。情報の種類。3 番目の DrawThread クラスはスレッド本体の実装に使用されます。2 番目のクラスは主にメイン関数
2、アカウント クラス
public class Account { //封装账户编号,账户余额和两个成员变量 private String accountNo; private double balance; public Account(){}; public Account(String accountNo,double balance){ this.accountNo=accountNo; this.balance=balance; } public void setAccountNo(String accountNo) { this.accountNo=accountNo; } public void setBalance(double balance){ this.balance=balance; } public String getAccountNo(){ return accountNo; } public double getBalance(){ return balance; } public int hashCode(){ return accountNo.hashCode(); } public boolean equals(Object obj){ if(this==obj){ return true; } if (obj!=null&&obj.getClass()==Account.class){ Account target=(Account)obj; return target.getAccountNo().equals(accountNo); } return false; } }
をカプセル化します。 3、DrawThread クラス
public class DrawThread extends Thread { //模拟用户账户 private Account account; //当前取钱线程所希望的取钱数 private double drawAmount; public DrawThread(String name, Account account, double drawAmount) { super(name); this.account = account; this.drawAmount = drawAmount; } //当多个线程修改同一个共享数据时,将涉及数据安全问题 public void run() { //使用account作为同步监视器,任何线程进入下面同步代码块之前 //必须先获得对account账户的锁定——其他线程无法获得锁,也就无法修改它 synchronized (account) { if (account.getBalance() >= drawAmount) { //吐出钞票 System.out.println(getName() + "取钱成功!吐出钞票:" + drawAmount); /* try { Thread.sleep(1); }catch (InterruptedException ex) { ex.printStackTrace(); } */ //修改余额 account.setBalance(account.getBalance() - drawAmount); System.out.println("\t余额为:" + account.getBalance()); } else { System.out.println(getName() + "取钱失败!余额不足!"); } } } }
4、DrawTest クラス
public class DrawTest { public static void main(String[] args){ //创建一个账户 Account acct=new Account("1234567",1000); //模拟两个线程对同一个账户取钱 new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start(); } }
実行結果:
上記のプログラムで注意すべき点の 1 つは、同期されたコード ブロックの使用です。 run() メソッドの同期の安全性の問題を解決できます。たとえば、2 つのスレッドが同時にリクエストを送信すると、例外が発生する可能性があります。
同期コード ブロック:
synchronized (obj){ //需要执行的代码 }
If run() メソッドを削除します。
Account acct=new Account("1234567",1000); new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start();
で同期コード ブロックを実行し続けます (銀行口座には合計 1,000 元があり、ジャックとローズはそれぞれ同じ口座からお金を引き出します)
実行結果:
以上がJavaマルチスレッドを使用して出金アプレットを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。