利用多线程实现并发调用,实现一个存钱多人取钱函数

  1 package com.thread;
  2 
  3 /**
  4  * @author lisj
  5  * 利用多线程实现并发调用
  6  * 根据条件实现线程的等待和运行
  7  */
  8 
  9 public class ThreadMoney {
 10 
 11     public static void main(String args[]){
 12         
 13         Moneyclass money=new Moneyclass();    //实例化Money类 
 14         getmoney son1=new getmoney(money); //实例化线程进行取钱
 15         getmoney son2=new getmoney(money);
 16         getmoney son3=new getmoney(money);
 17         putmoney father=new putmoney(money);//实例化线程进行存钱
 18         son1.setName("son1");    //线程取名
 19         son2.setName("son2");
 20         son3.setName("son3");
 21         father.setName("father");
 22         
 23         son1.start();    //线程运行
 24         son2.start();
 25         son3.start();
 26         father.start();        
 27       }
 28         
 29     }
 30 
 31 
 32     /**
 33      * @author lisj
 34      * 设置存钱函数和取钱函数
 35      */
 36     class Moneyclass{        //设置金钱数
 37         
 38         int money=0;
 39         
 40         synchronized void put(){    //负责存钱方法
 41         
 42             if(money<100){    //钱不够就存钱
 43                 money=money+100;
 44                 System.out.println(Thread.currentThread().getName()+"存入100元"+"现在money="+money);
 45             }else{
 46                 try {
 47                     wait();        //钱够就等待
 48                 } catch (InterruptedException e) {
 49                     // TODO Auto-generated catch block
 50                     e.printStackTrace();
 51                 }
 52             }
 53             
 54             notify();    //唤醒其他线程
 55                 
 56         }
 57         
 58         
 59         synchronized void get(int n){    //取钱方法 传入取钱数
 60             
 61             if(money<n){    //余额不足 等待线程
 62                 try {
 63                     wait();
 64                 } catch (InterruptedException e) {
 65                     // TODO Auto-generated catch block
 66                     e.printStackTrace();
 67                 }
 68                 
 69             }else{        //余额充足就取钱
 70                 money=money-n;
 71                 System.out.println(Thread.currentThread().getName()+"取出"+n+"元,"+"现在money="+money);
 72             }
 73             
 74             notify();    //唤醒其他线程
 75                 
 76         }
 77         
 78         
 79     }
 80 
 81 
 82     /**
 83      * @author lisj
 84      * 设置取钱线程
 85      */
 86     class getmoney extends Thread{
 87         
 88         Moneyclass a;
 89         
 90         getmoney(Moneyclass a){
 91             this.a=a;
 92         }
 93             
 94         public void run(){    //运行5次 取钱五次
 95             
 96             long outmoney=Math.round(Math.random()*100);
 97             
 98             for(int i=0;i<5;i++){
 99                 a.get((int) outmoney);            
100             }    
101             
102         }
103         
104         
105     }
106 
107 
108     /**
109      * @author lisj
110      * 设置存钱线程
111      */
112     class putmoney extends Thread{
113         
114         Moneyclass b;
115         
116         putmoney(Moneyclass b){
117             this.b=b;
118         }
119             
120         public void run(){    //存钱五次
121             
122             for(int i=0;i<5;i++){
123                 b.put();            
124             }    
125             
126         }        
127     }

 

posted @ 2014-07-28 21:35  云谷子  阅读(1731)  评论(0编辑  收藏  举报