线程之生产者消费者案例-送奶
package Mymodifier.testcode.src.Thread; public class SendMilkDemo { public static void main(String[] strings) { /* 生产者消费者案例: 1.奶箱类(Box):定义一个成员变量,表示第x瓶奶,提供存储和获取牛奶的操作 2.生产者(Producer):实现Runnable接口,重写run()方法,调用存储牛奶的操作 3.消费者(Customer):实现Runnable接口,重写run()方法,调用存储牛奶的操作 4.测试类(SendMilkDemo):里面有main方法,main方法中的代码步骤如下: a.创建奶箱对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 b.创建生产者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 c.创建消费者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 d.创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递 */ //创建奶箱对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Box b = new Box(); //创建生产者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Producer p = new Producer(b); //创建消费者对象,把奶箱作为构造方法参数传递,因为在这个类中要调用存储牛奶的操作 Comsumer c = new Comsumer(b); //创建2个线程对象,分别把生产者对象和消费者对象作为构造方法参数传递 Thread p2 = new Thread(p,"生产者"); Thread c2 = new Thread(c,"消费者"); //启动线程 p2.start(); c2.start(); } }
奶箱类:
package Mymodifier.testcode.src.Thread; public class Box { //定义一个成员变量,表示第x瓶奶 private int milk; //创建牛奶状态(默认为false) private boolean state = false; //存储牛奶数量(加了同步关键字才能使用wait(等待)和notify/All(唤醒)) public synchronized void put(int milk) { //如果牛奶状态为true if(state) { //则进入等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.milk = milk; //如果有牛奶,就消费牛奶 System.out.println("送奶工将第" + this.milk + "瓶放入奶箱"); //牛奶状态设置为true state = true; //唤醒全部等待线程 notifyAll(); } //获取牛奶数量 public synchronized void get() { //如果牛奶状态为false if (!state) { //则进入等待 try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //如果没有牛奶,就生产牛奶 System.out.println("用户拿到第" + this.milk + "瓶奶"); //牛奶状态设置为true state = false; //唤醒全部等待线程 notifyAll(); } }
生产者类(送奶工):
package Mymodifier.testcode.src.Thread; public class Producer implements Runnable { private Box b; public Producer(Box b) { this.b = b; } @Override public void run() { for(int i = 1; i < 6; i++) { b.put(i); } } }
消费者类:
package Mymodifier.testcode.src.Thread; public class Comsumer implements Runnable { private Box b; public Comsumer(Box b) { this.b = b; } @Override public void run() { while(true) { b.get(); } } }
上一篇:
IDEA上Java项目控制台中文乱码