欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java 学习笔记 使用synchronized实现生产者消费者模式

程序员文章站 2022-03-30 22:18:24
说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 consumer.java Producer.java Test.java ......

说明

  • object.wait()使当前的线程进入到等待状态(进入到等待队列)
  • object.notifyall() 唤醒等待中的全部线程
  • object.notify() 随机唤醒一个线程

代码

consumer.java

public class consumer extends thread {
    list<object> container;
    /*表示当前线程共生产了多少件物品*/
    private int count;

    public consumer(string name, list<object> container) {
        super(name);
        this.container = container;
    }

    @override
    public void run() {

        while(true){
            synchronized (container) {
                try {
                    if (container.isempty()) { //仓库已空,不能消 只能等
                        container.wait(20);

                    } else {
                        // 消费
                        container.remove(0);
                        this.count++;
                        system.out.println("消费者:" + getname() + " 共消费了:" + this.count + "件物品,当前仓库里还有" + container.size() + "件物品");
                        container.notifyall();  // 唤醒等待队列中所有线程
                    }

                } catch (interruptedexception e) {
                    e.printstacktrace();
                }
            }

            try {
                sleep(10);
            } catch (interruptedexception e) {
                e.printstacktrace();
            }
        }
    }
}

producer.java

public class producer extends thread{

    list<object> container;
    /*表示当前线程共生产了多少件物品*/
    private int count;

    public producer(string name, list<object> container) {
        super(name);
        this.container = container;
    }

    @override
    public void run() {
        while (true) {
            synchronized (container) {
                try {
                    // 如果某一个生产者能执行进来,说明此线程具有container对象的控制权,其它线程(生产者&消费者)都必须等待
                    if (container.size() == 10) { // 假设container最多只能放10个物品,即仓库已满
                        container.wait(10); //表示当前线程需要在container上进行等待
                    } else {
                        // 仓库没满,可以放物品
                        container.add(new object());
                        this.count++;
                        system.out.println("生产者:" + getname() + " 共生产了:" + this.count + "件物品,当前仓库里还有" + container.size() + "件物品");
                        // 生产者生产了物品后应通知(唤醒)所有在container上进行等待的线程(生产者&消费者)
                        //   生:5, 消:5
                        // container.notify();  // 随机唤醒一个在等待队列中的线程
                        container.notifyall();  // 唤醒等待队列中所有线程
                    }
                } catch (interruptedexception e) {
                    e.printstacktrace();
                }
            } //

            try {
                sleep(20);
            } catch (interruptedexception e) {
                e.printstacktrace();
            }
        }
    }
}

test.java

public class test {

    public static void main(string[] args) {
        // 仓库
        list<object> container = new arraylist<>();

        new producer("老王", container).start();
        new consumer("小芳", container).start();
        new producer("老李", container).start();
        new consumer("小荷", container).start();
        new producer("老张", container).start();

        new consumer("小花", container).start();
        new producer("老刘", container).start();
        new consumer("小妞", container).start();
        new consumer("小米", container).start();
        new producer("老马", container).start();

    }
}