生产者和消费者
生产者
- 1.判断桌子上是否有披萨,有则等待,无则生产
- 2.把披萨放在桌子上
- 3.叫醒等待的消费者开吃
消费者
- 1.判断桌子上是否有披萨
- 2.如果没有则继续等待
- 3.如果有则开吃
- 4.吃完之后,桌子上的披萨就没有了,叫醒等待的生产者继续生产,披萨数量减1
生产者和消费者代码实现
-
生产者
package com.cmy.threaddemo10; /** * @author 陈明勇 */ public class Cooker extends Thread { private Desk desk; public Cooker(Desk desk) { this.desk = desk; } @Override public void run() { while (true) { synchronized (desk.getLock()) { // 判断披萨数量是否为0 if (desk.getCount() == 0) { break; } else { if (!desk.isFlag()) { // 生产披萨 System.out.println("厨师正在生产披萨中..."); desk.setFlag(true); desk.getLock().notifyAll(); } else { try { desk.getLock().wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } }
-
消费者
package com.cmy.threaddemo10; /** * @author 陈明勇 */ public class Foodie extends Thread { private Desk desk; public Foodie(Desk desk) { this.desk = desk; } @Override public void run() { while (true) { synchronized (desk.getLock()) { if (desk.getCount() == 0) { break; } else { if (desk.isFlag()) { // 有披萨 System.out.println("吃货在吃披萨..."); desk.setFlag(false); desk.getLock().notifyAll(); desk.setCount(desk.getCount() - 1); } else { // 没有披萨 // 使用什么对象当做锁,那么必须要用这个对象去等待和唤醒 try { desk.getLock().wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } }
-
Desk类
package com.cmy.threaddemo10; /** * @author 陈明勇 */ public class Desk { /** * 标记 * 如果是true,就表示桌子上有披萨,此时允许吃货执行 * 如果是false,就表示桌子上没有披萨,此时允许厨师执行 */ private boolean flag; /** * 披萨的数量 */ private int count; /** * 锁对象 */ private final Object lock = new Object(); public Desk() { this(false, 10); } public Desk(boolean flag, int count) { this.flag = flag; this.count = count; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } public int getCount() { return count; } public void setCount(int count) { this.count = count; } public Object getLock() { return lock; } }
-
测试类
package com.cmy.threaddemo10; /** * @author 陈明勇 */ public class Demo { public static void main(String[] args) { Desk desk = new Desk(); Foodie f = new Foodie(desk); Cooker c = new Cooker(desk); f.start(); c.start(); } }
-
编写代码思路
1.while(true) 死循环 2.synchronized 锁,锁要唯一 3.判断,共享数据是否结束,结束 4.判断,共享数据是否结束,没有