本帖最后由 Computer001 于 2011-03-26 22:18:27 编辑

解决方案 »

  1.   

    那是因为打印没有同步,你把run的System.out.println方法放到bank的对应方法里就可以了
      

  2.   

    楼上正解!代码改成这样就好了,另外建议把儿子的run方法也改成for循环 while(true)导致儿子不停的要钱,爸爸生气不干了,但是JVM还是一直在等待爸爸赚钱,JVM太可怜了
    import java.math.*;class MakeAndUse
    {
    public static void main(String[] args)
    {
    Bank bank = new Bank();
    Father father = new Father(bank);
    Son son = new Son(bank);
    father.start();
    son.start();
    }
    }class Father extends Thread
    {
    Bank bank; Father(Bank bank)
    {
    this.bank = bank;
    } public void run()
    {
    float radom;
    for (int i = 1; i <= 10; i++)
    {
    radom = (float) (int) (Math.random() * 1000);// 爸爸往银行随机的存入现金
    bank.MakeMoney(radom);
    }
    }
    }class Son extends Thread
    {
    Bank bank; Son(Bank bank)
    {
    this.bank = bank;
    } public void run()
    {
    for (int i = 1; i <= 10; i++)
    {
    bank.UseMoney();
    }
    }
    }class Bank
    {
    float money;
    boolean hasMoney = false;
    int count = 0; public synchronized void MakeMoney(float money)
    {
    if (!hasMoney)// 如果银行没钱,那就赚钱往银行存入
    {
    this.money += money;
    hasMoney = true;// 告诉儿子银行有钱了
    count++;
    System.out.println("Father MakeMoney " + count + " : [ " + money
    + " ] dollar");
    notify();// 叫醒儿子去花钱
    } // 如果银行有钱的情况下
    try
    {
    wait();// 等待儿子把钱花掉
    }
    catch (Exception e)
    {
    }
    } public synchronized float UseMoney()
    {
    if (!hasMoney)// 如果银行没钱
    {
    try
    {
    wait();// 等待爸爸赚钱存入银行
    }
    catch (Exception e)
    {
    }
    } // 如果银行有钱的情况下
    hasMoney = false;// 告诉爸爸银行没钱了
    notify(); // 儿子叫醒爸爸去赚钱
    float dollar = money;
    money -= money;
    System.out.println("Son UseMoney : [ " + dollar + " ] dollar \n");
    return dollar;// 儿子把银行所有的钱都花掉
    }}