定义一个公共使用对象 public class Desk { /** * 控制生产者和消费者执行 */ //是否有面条 0-没有 1-有 public static int foodFlag=0; //总数 public static int count =10; //锁对象 public static Object lock = new Object(); }
消费者代码实现
public class Foodie extends Thread { @Override public void run() { /** * 1.循环 * 2.同步代码块 * 3.判断共享数据是否到了末尾(到了末尾) * 4.判断共享数据是否到了末尾(没有到末尾,执行核心逻辑) * */ while (true){ synchronized (Desk.lock){ if(Desk.count == 0){ break; }else { if(Desk.foodFlag==0){ //如果没有就等待 try { Desk.lock.wait();//让当前线程跟锁绑定 } catch (InterruptedException e) { e.printStackTrace(); } }else { //把吃完的总数-1 Desk.count--; //如果有就开吃 System.out.println("吃货正在吃面条,还能再吃"+Desk.count+"碗!!"); //吃完之后唤醒厨师继续做 Desk.lock.notifyAll(); //修改着桌子的状态 Desk.foodFlag = 0; } } } } } }
生产者代码实现
public class Cook extends Thread { /** * 1.循环 * 2.同步代码块 * 3.判断共享数据是否到了末尾(到了末尾) * 4.判断共享代码块是否到了末尾(没有到末尾,执行核心逻辑) */ @Override public void run() { while (true){ synchronized (Desk.lock){ if(Desk.count == 0){ break; }else { //判断桌子上是否有食物 if(Desk.foodFlag == 1){ //如果有就等待 try { Desk.lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }else { //如果没有食物,就制作 System.out.println("厨师做了一碗面条"); //修改桌子上的食物状态 Desk.foodFlag = 1; //叫醒等待的消费者开吃 Desk.lock.notifyAll(); } } } } } }
线程开启
public class ThreadDemo { public static void main(String[] args) { Foodie f = new Foodie(); Cook c = new Cook(); f.setName("吃货"); c.setName("厨师"); //开启线程 c.start(); f.start(); } }
运行结果
厨师做了一碗面条
吃货正在吃面条,还能再吃9碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃8碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃7碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃6碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃5碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃4碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃3碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃2碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃1碗!!
厨师做了一碗面条
吃货正在吃面条,还能再吃0碗!!