生产者消费者

注:处于wait状态下的线程没有被唤醒,不能去抢锁

1.容器

复制代码
public class Stack {
    char[] a=new char[5];
    int i;
    //压入
    void pull(char s){
        if (i==5) {
            return;
        }
        a[i]=s;
        i++;
    }
    //取出
    char push(){
        if (i==0) {
            return ' ';
        }
        i--;
        return a[i];
    }
    int size(){
        return i;
    }
}
复制代码

2.生产者

复制代码
public class Producer extends Thread{
    private Stack stack;
    public Producer(Stack stack) {
        this.stack=stack;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (stack) {
                while (stack.size()==5) {
                    System.out.println("盘子满了,需等待");
                    try {
                        stack.wait();
                    } catch (InterruptedException e) {
                        System.out.println("盘子满了,需等待");
                    }
                }
                char a = (char) ('a'+new Random().nextInt(26));
                stack.pull(a);
                System.out.println("压入数据 : "+a);
                //压入数据后发出通知,盘子里面有数据了
                stack.notifyAll();
            }
        }
    }
}
复制代码

3.消费者

复制代码
public class Consumer extends Thread {
    private Stack stack;
    public Consumer(Stack stack) {
        this.stack=stack;
    }
    @Override
    public void run() {
        while (true) {
            synchronized (stack) {
                while (stack.size()==0){
                    System.out.println("盘子里面没有数据,需等待");
                    try {
                        stack.wait();
                    } catch (InterruptedException e) {
                        System.out.println("盘子里面没有数据,需等待");
                    }
                }
                char a = stack.push();
                System.out.println("取出数据 : "+a);
                //取出数据后发出通知,盘子里面可以放东西了
                stack.notifyAll();
            }
        }
    }
}
复制代码

4.测试

复制代码
public class Test {
    public static void main(String[] args) {
        Stack stack = new Stack();
        Producer producer = new Producer(stack);
        Consumer consumer = new Consumer(stack);
        producer.start();
        consumer.start();

    }
} 
复制代码

 

posted @   我爱si搬砖  阅读(111)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
· 程序员常用高效实用工具推荐,办公效率提升利器!
点击右上角即可分享
微信分享提示