zoukankan      html  css  js  c++  java
  • 多线程-生产者和消费者问题

    生产者和消费者问题

    生产者和消费者的问题是一个线程通信的例子。
    比如买馒头,需要先进行生产,生产了就通知消费者来吃馒头。如果馒头没了就通知生产者继续生产。

    public class Test {
        public static void main(String[] args) {
            Click click = new Click(0);
    
            new Thread(new Productor(click),"生产").start();
            new Thread(new Consumer(click),"消费").start();
        }
    }
    //生产者
    class Productor implements Runnable{
        private Click click;
        Productor(Click click){
            this.click = click;
        }
        @Override
        public void run() {
            while (true){
                synchronized (click) {
                    if (click.num < 10) {
                        click.num++;
                        System.out.println(Thread.currentThread().getName() + "第:" + click.num + "个商品");
                        click.notify();
                    } else {
                        try {
                            click.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    //消费者
    class Consumer implements Runnable{
        private Click click;
        Consumer(Click click){
            this.click = click;
        }
        @Override
        public void run() {
            while (true) {
                synchronized (click) {
                    if (click.num > 0) {
                        System.out.println(Thread.currentThread().getName() + "第:" + click.num + "个商品");
                        click.num--;
                        click.notify();
                    } else {
                        try {
                            click.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    //馒头店
    class Click{
        int num;
        Click(int num){
            this.num = num;
        }
    }
    

    运行结果:

    这里需要注意synchronized的锁对象应该是馒头店,不能是this。因为馒头店只有一个,而this指当前对象,生产者和消费者都创建了,所以使用this不行。

  • 相关阅读:
    linux软硬链接
    yum配置文件位置
    What is Docker?
    easy_install下载地址及安装
    python setuptools安装
    django--模板
    django基础PROJECT APP View template
    flask+uswgi+nginx+python3.6的venv发布网站ubuntu14.04
    Mixnode 让操作网络资源和数据库一样简单,不一样的爬虫!
    React Native vs. Cordova.
  • 原文地址:https://www.cnblogs.com/Z-Dey/p/12896393.html
Copyright © 2011-2022 走看看