需求:一瓶酒两元,两个瓶子换一瓶酒,四个瓶盖换一瓶酒,那么买100瓶酒最少需要多少钱!
实现方法有很多种,这里我采用最简单的synchronized 同步实现
瓶子和瓶盖换酒有四种可能:
1:瓶子 >=2 并且 盖子 >= 4 可以一次换两瓶酒, 换完后,会多两个瓶子和瓶盖
2:瓶子 >= 2 且 盖子 < 4 可以换一瓶酒,换完后,会一个瓶子合一个盖子
3:瓶子 < 2 且 盖子 >=4 可以换一瓶酒,换完后,会一个瓶子合一个盖子
4: 瓶子 < 2 且 盖子 < 4 不能换酒,需要掏2元钱买
<pre name="code" class="java">package com.jack.thread;
/**
* @author lvh
* 一瓶酒两元,两个瓶子换一瓶酒,四个瓶盖换一瓶酒,那么买100瓶酒最少需要多少钱
*/
public class BeerTest {
public static void main(String[] args) {
Beer beer = new Beer();
BuyBeer buyBeer = new BuyBeer(beer);
SellBeer sellBeer = new SellBeer(beer);
Thread buy = new Thread(buyBeer,"buy");
Thread sell = new Thread(sellBeer,"sell");
buy.start();
sell.start();
}
}
class SellBeer implements Runnable {
Beer beer;
public SellBeer(Beer beer) { this.beer = beer;}
public void run() {
while((beer.beers < Beer.total)) {
beer.sell();
}
return;
}
}
class BuyBeer implements Runnable {
Beer beer;
public BuyBeer(Beer beer) { this.beer = beer;}
public void run() {
while((beer.beers < Beer.total)) {
beer.buy();
}
System.out.println(Thread.currentThread().getName() +
" total = "+ beer.money + " beers "+beer.beers + " bottles = "+ beer.bottles + " caps = "+ beer.caps);
return;
}
}
class Beer {
int bottles; //剩下瓶子数
int caps; //剩下盖子数
//啤酒总数
static int total = 100;
//当前啤酒数
int beers;
//钱
float money;
public Beer() {
bottles = 0;
caps = 0;
money = 0;
beers = 0;
}
public synchronized void addBeer() {
beers++;
bottles++;
caps++;
System.out.println(Thread.currentThread().getName() +
" buy money = "+ money + " beers "+beers + " bottles = "+ bottles + " caps = "+ caps);
}
//买啤酒
public synchronized void buy() {
if(beers >= Beer.total) {
System.out.println("buy");
return;
}
try {
while((bottles >= 2 || caps >= 4)) {
this.wait();
}
this.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
money = money + 2;
addBeer();
}
//用瓶子或盖子兑换啤酒
public synchronized void sell() {
if(beers >= Beer.total) {
System.out.println("sell");
return;
}
try {
while((bottles < 2 && caps < 4)) {
this.wait();
}
this.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(bottles >= 2 && caps >= 4 && Beer.total > beers) {
bottles = bottles - 2;
caps = caps - 4;
beers = beers + 2;
bottles = bottles + 2;
caps = caps + 2;
} else if(bottles >= 2 && Beer.total > beers) {
//两个瓶子换一瓶酒
bottles = bottles - 2;
addBeer();
} else if(caps >= 4 && Beer.total > beers){
//四个瓶盖换一瓶酒
caps = caps - 4;
addBeer();
}
}
}
答案:54元能买100瓶啤酒,还剩2个瓶子,4个盖子
这个题目再变形一下!
一瓶酒两元,两个瓶子换一瓶酒,四个瓶盖换一瓶酒,那么100元钱能最多能买多少瓶酒!
有兴趣的,可以考虑下哟!