日期:2014-05-20 浏览次数:21190 次
public class Test {
static class Mother extends Thread{
/** 盐的用量 */
final int SaltUseage = 40;
volatile boolean cooking = true;
Home home;
public void run(){
try {
while(cooking){
Salt salt = home.salt;
if(salt.value<SaltUseage){
home.son.buySalt();
waiting();
}
System.out.println("[妈妈]盐 ==>> 当前量:"+salt.value+" 用去量:"+SaltUseage+" 剩余量:"+(salt.value-SaltUseage));
salt.value -= SaltUseage;
otherThings();
}
} catch (Exception e) {
cooking = false;
}
}
private void otherThings() {
try {
sleep(1000);
} catch (Exception e) {
cooking = false;
}
}
private synchronized void waiting() throws InterruptedException {
System.out.println("[妈妈]盐 ==>> 当前量:"+home.salt.value+" 等待儿子去买盐。");
home.mother.wait();
}
private synchronized void notice(){
home.mother.notify();
}
}
static class Son extends Thread{
/** 盐的购买量 */
final int SaltPurchases = 60;
volatile boolean free = true;
Home home;
public void run(){
try {
while(free){
waiting();
sleep(2000);
System.out.println("[儿子]盐 ==>> 当前量:"+home.salt.value+" 购买量:"+SaltPurchases+" 剩余量:"+(home.salt.value+SaltPurchases));
home.salt.value += SaltPurchases;
notice();
}
} catch (Exception e) {
free = false;
}
}
public synchronized void buySalt(){
notify();
}
private void notice() {
System.out.println("[儿子]盐 ==>> 当前量:"+home.salt.value+" 告知妈妈盐已买到。");
home.mother.notice();
}
private synchronized void waiting() throws InterruptedException {
System.out.println("[儿子]盐 ==>> 当前量:"+home.salt.value+" 等待下次购买。");
wait();
}
}
static class Salt{
int value = 90;
}
static class Home{
Mother mother = new Mother();
Son son = new Son();
Salt salt = new Salt();
public Home(){
mother.home = this;
son.home = this;
}
public void startCooking(){
mother.start();
son.start();
}
public void stopCooking(){
mother.cooking=false;
son.free=false;
mother.interrupt();
son.interrupt();
}
}
/**
* 测试用例
*/
public static void main(String[] args) throws Exception {
Home home = new Home();
home.startCooking();
Thread.sleep(15000);
home.stopCooking();
}
}
------解决方案--------------------
写着玩了一下
public class Mouther extends Thread{
private Time t;
public Mouther(Time t){
this.t=t;
}
public void run(){
synchronized (t) {
System.out.println("做饭..");
if(t.isHaveSalt()==false){
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("有盐做饭了");
System.exit(1);
}
}
}
}
public class Son extends Thread{
private Time t;
public Son(Time t){
this.t=t;
}
public void run(){
synchronized (t) {
System.out.println("sonrun");
if(t.isHaveSalt()==false){
System.out.println("买盐");
for(int i=this.t.getTime();i>=0;i--){
System.out.println("时间:"+i);
}
System.out.println(t.getTime());
System.out.println("买完.....");
t.notifyAll();
}
}
}
public static void main(String[] args) {
Time t= new Time();
t.setTime(10000);
t.setHaveSalt(false);
Son s = new Son(t);
Mouther m = new Mouther(t);
m.start();
s.start();
}
}
public class Time {
private int time;
private boolean haveSalt;
public boolean isHaveSalt() {
return haveSalt;
}
public void setHaveSalt(boolean haveSalt) {
this.haveSalt = haveSalt;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
}