要求:
(1).两条线程操作共同的数据
(2).可以同时满足存钱取钱功能
上代码
1.银行卡类
/* 银行卡余额 */ public class BanlCard { private int balance;//余额 public BanlCard(int balance) { this.balance = balance; } public BanlCard() { } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } }
2.存钱功能类
/* 存钱 */ public class SaveMoney implements Runnable{ private BanlCard card; public SaveMoney(BanlCard card){ this.card=card; } @Override public void run() { while (true) { synchronized (card) { try { //这里我设置最多银行卡只能存1000 if(card.getBalance()>=1000){ card.wait(); } else { //每次存钱金额为100 card.setBalance(card.getBalance()+100); System.out.println(Thread.currentThread().getName()+"存了100元,余额:"+card.getBalance()); Thread.sleep(500); card.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } } } } }
3.取钱功能类
/* 取钱 */ public class SubMoney implements Runnable { private BanlCard card; public SubMoney(BanlCard card){ this.card=card; } @Override public void run() { while (true) { synchronized (card) { try { if(card.getBalance()==0){ System.out.println("该充钱了"); card.wait(); } else { //每次取钱金额为50 card.setBalance(card.getBalance()-50); System.out.println(Thread.currentThread().getName()+"取出50元,余额:"+card.getBalance()); Thread.sleep(300); card.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } } } } }
4.测试类
public class Banktest { public static void main(String[] args) { //1.创建银行卡对象 BanlCard banlCard=new BanlCard(); //2.存钱功能 SaveMoney saveMoney=new SaveMoney(banlCard); //3.取钱功能 SubMoney subMoney=new SubMoney(banlCard); //4.开启两条线程 new Thread(saveMoney,"小张").start(); new Thread(subMoney,"小王").start(); } }
5.代码运行效果图