生产者与消费者线程的问题没有同步 本帖最后由 Computer001 于 2011-03-26 22:18:27 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 那是因为打印没有同步,你把run的System.out.println方法放到bank的对应方法里就可以了 楼上正解!代码改成这样就好了,另外建议把儿子的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;// 儿子把银行所有的钱都花掉 }} 同样的“循环热点” 结果Java快于C#30多秒! 突然发现自己的日食打不开了! JRadioButton怎么把已选中状态改为不被选中? 大家帮忙看看,很简单但出错了 数据在jsp上显示的问题! Visual Editor With Eclipse 3.0.1 运行时抛出异常 问个菜鸟问题:为什么eclipse不用安装直接点击eclipse.exe就可以用啊? java初学者必读:Thinking In Java第二版(中文版)下载地址 static变量不会被注销吗? 对于java,谁能告诉我,初学者应该如何入手? [SWING]容器类组件渲染子组件的原理 编译出来找不到符号 是什么问题
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;// 儿子把银行所有的钱都花掉
}}