1. Java 클래스 생성
여기에는 세 개의 Java 클래스가 생성됩니다. 첫 번째 Account 클래스는 계정의 다양한 정보를 캡슐화하는 데 사용됩니다. 세 번째 DrawThread 클래스는 두 번째 클래스를 구현하는 데 사용됩니다. 주로 주요 기능2, Account 클래스
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(); } }을 캡슐화합니다. 실행 결과: 에 대해 위의 프로그램은 동기화된 코드 블록을 사용합니다. run() 메서드의 동기화 안전 문제를 해결할 수 있습니다. 예를 들어 두 스레드가 동시에 요청을 보내면 예외가 발생할 수 있습니다. 동기화된 코드 블록:
synchronized (obj){ //需要执行的代码 }에서 동기화된 코드 블록을 제거하면 run() 메서드를 사용하여 계속 실행합니다
Account acct=new Account("1234567",1000); new DrawThread("jack",acct,800).start(); new DrawThread("rose",acct,800).start();(은행 계좌에 총 1,000위안이 있고 Jack과 Rose가 각각 같은 계좌에서 돈을 인출합니다.) 실행 결과:
위 내용은 Java 멀티스레딩으로 출금 애플릿을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!