线程通信---银行存钱取钱问题

来源:互联网 发布:alphago算法原理 编辑:程序博客网 时间:2024/04/29 03:43

 

Acount.java

Acount类,包括存钱,取钱的方法

package com.Thread;class Acount{private String no;//IDprivate double count;//银行卡余额private boolean flag = false;public Acount(String no,double count){this.no = no;this.count = count;}public String getNo() {return no;}public void setNo(String no) {this.no = no;}public double getCount() {return count;}public void setCount(double count) {this.count = count;}//同步方法,属于对象,所以此处的监视锁相当于thispublic synchronized void draw(double drawAcount){if(flag){if(drawAcount <= this.getCount()){//System.out.println("取钱成功,吐出钞票"+drawAcount);//修改余额this.setCount(this.getCount()-drawAcount);System.out.println("取钱成功,余额为:"+this.getCount());flag = false;//取钱结束后,唤醒wait()的线程this.notifyAll();}else{System.out.println("余额不足,取钱失败");}}else{try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}//同步方法,属于对象,所以此处的监视锁相当于thispublic synchronized void dispos(double disposAcount){    //修改余额if(!flag){this.setCount(this.getCount()+disposAcount);System.out.println("存钱成功,余额为:"+this.getCount());flag = true; //存钱结束后,唤醒wait()的线程this.notifyAll();}else{try {this.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}


 

disposThread.java

存钱线程

//存钱线程package com.Thread;public class disposeThread extends Thread {private Acount acount;private double disposAcount;public disposeThread(Acount acount,double disposAcount){this.acount = acount;this.disposAcount = disposAcount;}public void run() {//System.out.println("存钱线程:");for(int i = 0; i< 10;++i){System.out.println("存钱线程:"+i);acount.dispos(disposAcount);}      }}


 

DrawThread2.java

取钱线程,主函数

package com.Thread;//使用Acount类public class DrawThread2 extends Thread {private Acount acount;private double drawAcount;public DrawThread2(Acount acount,double drawAcount){this.acount = acount;this.drawAcount = drawAcount;}public void run() {//System.out.println("取钱线程:");for(int i = 0;i<10;i++){System.out.println("取钱线程:"+i);acount.draw(drawAcount);  }    }public static void main(String[] args) { Acount acount = new Acount("lily",1000.0); //启动两个并发的线程对acount取钱 //new DrawThread(acount,1000.0).start();  //new DrawThread(acount,1000.0).start(); new disposeThread(acount,1000.0).start(); new DrawThread2(acount,1000.0).start();    }}


其中一次的执行结果

存钱线程:0取钱线程:0存钱成功,余额为:2000.0存钱线程:1取钱成功,余额为:1000.0取钱线程:1存钱线程:2存钱成功,余额为:2000.0存钱线程:3取钱线程:2取钱成功,余额为:1000.0取钱线程:3存钱线程:4存钱成功,余额为:2000.0存钱线程:5取钱线程:4取钱成功,余额为:1000.0取钱线程:5存钱线程:6存钱成功,余额为:2000.0存钱线程:7取钱线程:6取钱成功,余额为:1000.0取钱线程:7存钱线程:8存钱成功,余额为:2000.0存钱线程:9取钱线程:8取钱成功,余额为:1000.0取钱线程:9


 

0 0
原创粉丝点击