编程语言
首页 > 编程语言> > java基础-生产者消费者

java基础-生产者消费者

作者:互联网

生产者消费者遵守规则:

例子:生产者-厨师 消费者-客人

厨师煎牛排,桌子上一块都没有 客人需要等待

桌子上牛排满了,厨师不需要生产 需要客人去拿(线程)

厨师在煎牛排过程中,如果没有煎完,客人不能去拿

客人没有拿完,不能把客人赶走

生产者消费者代码例子

定义桌子类存放牛排

public class Table {
    LinkedList<Object> list = new LinkedList<>();
    private static final int Max=100;

    //存储产品
    public synchronized void store(String product){
        //如果仓库已满 生产者等待;
        while (list.size()>Max){
            try {
                this.wait(); //wait();notify()这两个在同步代码块中,由锁对象调用
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(Thread.currentThread().getName()+"++存储了"+product);//把产品存进去
        list.offer(product);

    }
    //取产品
    public synchronized void take(){
        //判断仓库是否为空,当仓库空时需要等待
        while (list.size() <= 0){
            try{
                this.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
        Object product = list.poll();//把前面的产品取出来
        System.out.println(Thread.currentThread().getName()+"--消费了"+product);
        //通知生产者继续生产
        this.notify();
    }
}


定义生产者

public class Product extends Thread {
    private Table table;
    public Product(Table table) {
        super();
        this.table = table;
    }
    @Override
    public void run(){
        for(int i=0;i<30;i++){
            String product = "产品编号:"+new Random().nextInt(100);
            table.store(product);
        }
    }
}

定义消费者

public class ConsumerThread extends Thread {
    private Table table;
    public ConsumerThread(Table table) {
        super();
        this.table = table;
    }
    @Override
    public void run(){
        for(int i=0;i<30;i++){
            table.take();
        }
    }
}

测试类:

class test{
    public static void main(String[] args) {
        //创建桌子
        Table table = new Table();
        //创建3个生产者线程模拟三个人
        Product p1= new Product(table);
        Product p2= new Product(table);
        Product p3= new Product(table);
        p1.setName("张三");
        p2.setName("李四");
        p3.setName("王五");
        p1.start();
        p2.start();
        p3.start();

        ConsumerThread c1 = new ConsumerThread(table);
        ConsumerThread c2 = new ConsumerThread(table);
        ConsumerThread c3 = new ConsumerThread(table);
        c1.setName("吃货1号");
        c2.setName("吃货2号");
        c3.setName("吃货3号");
        c1.start();
        c2.start();
        c3.start();
    }
}

例子2:两个线程交替打印奇数和偶数

public class PrintNum {
    private int num=0;
    //打印奇数
    public synchronized void printJi(){
        //当num是偶数时需要等待
        while (num % 2==0){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        System.out.println(Thread.currentThread().getName()+":"+num);
        num++;
        //通知打印偶数
        this.notify();
    }
    //打印偶数
    public synchronized void printOu(){
        //当num是奇数时需要等待
        while (num % 2==1){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
        System.out.println(Thread.currentThread().getName()+":"+num);
        num++;
        //通知打印奇数
        this.notify();
    }
}
class test09{
    public static void main(String[] args) {
        PrintNum printNum = new PrintNum();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    printNum.printJi();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    printNum.printOu();
                }
            }
        }).start();
    }
}

标签:java,消费者,生产者,void,ConsumerThread,num,new,table,public
来源: https://www.cnblogs.com/nanao/p/15130876.html