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 }