>Java >java지도 시간 >Java 멀티스레딩으로 출금 애플릿을 구현하는 방법

Java 멀티스레딩으로 출금 애플릿을 구현하는 방법

王林
王林앞으로
2023-05-24 19:16:141464검색

1. Java 클래스 생성

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();
    }
}

을 캡슐화합니다. 실행 결과:

Java 멀티스레딩으로 출금 애플릿을 구현하는 방법

에 대해 위의 프로그램은 동기화된 코드 블록을 사용합니다. 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 멀티스레딩으로 출금 애플릿을 구현하는 방법

위 내용은 Java 멀티스레딩으로 출금 애플릿을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제