java 生產消費者模式(一)
阿新 • • 發佈:2018-12-06
需求:一瓶酒兩元,兩個瓶子換一瓶酒,四個瓶蓋換一瓶酒,那麼買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元錢能最多能買多少瓶酒!
有興趣的,可以考慮下喲!