• 多线程间通信wait(),notify(),notifyAll()


    多线程间通信wait(),notify(),notifyAll()

    通过一个简单的例子实现多线程间通讯的demo

    简单介绍

    线程间互相通讯使用的是对象的wait(),notify()方法,为保证每个消费者都能够得到消费的对象,所以需要用到同步锁synchronized配合wait(),notify
    ()来实现。

    1.首先有一个生产者,来生产消费者所需的元素。

    public class Provider extends Thread {
    
        @Override
        public void run() {
    
            while (true) {
                synchronized (queue) {
                    try {
                        addFood(queue);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
    
        }
    }

    2.接下来是消费者,在测试中使用了3个消费者来消费

    public class Consumer extends Thread {
    
        @Override
        public void run() {
            while (true) {
                try {
                    eatFood(foodQueue);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    3.当生产数大于5个的时候通知消费者消费。

    部分打印结果。

    库吃咔,生产出来一个,现在有1个食物了。
    库吃咔,生产出来一个,现在有2个食物了。
    库吃咔,生产出来一个,现在有3个食物了。
    库吃咔,生产出来一个,现在有4个食物了。
    库吃咔,生产出来一个,现在有5个食物了。
    已经够多了,大家可以吃了,生产者进入等待
    王五拿到了食物,正在吃。。。代号为 9495 的食物
    李四拿到了食物,正在吃。。。代号为 5380 的食物
    张三拿到了食物,正在吃。。。代号为 4289 的食物
    库吃咔,生产出来一个,现在有3个食物了。
    库吃咔,生产出来一个,现在有4个食物了。
    库吃咔,生产出来一个,现在有5个食物了。
    已经够多了,大家可以吃了,生产者进入等待
    王五拿到了食物,正在吃。。。代号为 5527 的食物
    李四拿到了食物,正在吃。。。代号为 8295 的食物
    库吃咔,生产出来一个,现在有4个食物了。
    库吃咔,生产出来一个,现在有5个食物了。
    已经够多了,大家可以吃了,生产者进入等待
    王五拿到了食物,正在吃。。。代号为 1175 的食物
    库吃咔,生产出来一个,现在有5个食物了。
    已经够多了,大家可以吃了,生产者进入等待
    李四拿到了食物,正在吃。。。代号为 2581 的食物
    张三拿到了食物,正在吃。。。代号为 1598 的食物
    库吃咔,生产出来一个,现在有4个食物了。
    库吃咔,生产出来一个,现在有5个食物了。
    已经够多了,大家可以吃了,生产者进入等待
    李四拿到了食物,正在吃。。。代号为 49 的食物
    王五拿到了食物,正在吃。。。代号为 603 的食物
    库吃咔,生产出来一个,现在有4个食物了。

    完整代码地址

  • 相关阅读:
    ValueError: source code string cannot contain null bytes
    django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'localhost' ([Errno 11001] No address found)")
    数据库索引
    Python深拷贝与浅拷贝
    ascii、unicode、utf-8、gbk
    map、reduce、filter 的用法
    TCP / UDP的区别
    男神鹏:SyntaxError: invalid character in identifier 报错!!
    男神鹏:机器学习之混淆矩阵的理解
    男神鹏:Visual Studio Code 解决红色波浪线操作
  • 原文地址:https://www.cnblogs.com/lvgo/p/13275831.html
Copyright © 2020-2023  润新知