Java多线程-生产者消费者例子-使用Synchronized实现

Java多线程-生产者消费者例子-使用Synchronized实现

import java.util.LinkedList;
import java.util.List;

/**
 * Created by wisgood .
 */
public class ProducerConsumerWithSynchronizedDemo {
    public static void main(String[] args) {
        ProductFactoryWithSynchronized productFactory = new ProductFactoryWithSynchronized(10);
        new Thread(new ProducerWithSynchronized(productFactory),"1号生产者").start();
        new Thread(new ConsumerWithSynchronized(productFactory),"1号消费者").start();
        new Thread(new ConsumerWithSynchronized(productFactory),"2号消费者").start();
    }
}

class ProductFactoryWithSynchronized {
    private List<String> products;
    private int capacity = 0;
    public ProductFactoryWithSynchronized(int capacity) {
        this.capacity = capacity;
        products = new LinkedList<>();
    }
    // 生产产品
    public synchronized void produce(String product) {
        while (capacity == products.size()) {
            try {
                //打日志的目的是更好的观察消费者和生产者状态
                System.out.println("警告:线程("+Thread.currentThread().getName() + ")准备生产产品,但产品池已满");
                wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        products.add(product);
        System.out.println("线程("+Thread.currentThread().getName() + ")生产了一件产品:" + product+";当前剩余商品"+products.size()+"个");
        notify();
    }

    // 消费产品
    public synchronized String consume() {
        while (products.size()==0) {
            try {
                //打日志的目的是更好的观察消费者和生产者状态
                System.out.println("警告:线程("+Thread.currentThread().getName() + ")准备消费产品,但当前没有产品");
                wait();

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        String product = products.remove(0) ;
        System.out.println("线程("+Thread.currentThread().getName() + ")消费了一件产品:" + product+";当前剩余商品"+products.size()+"个");
        notify();
        return product;
    }
}

// 生产者
class ProducerWithSynchronized implements Runnable {
    private ProductFactoryWithSynchronized productFactory;
    public ProducerWithSynchronized(ProductFactoryWithSynchronized productFactory) {
        this.productFactory = productFactory;
    }
    public void run() {
        int i = 0 ;
        while (true) {
            productFactory.produce(String.valueOf(i));
            i++;
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

// 消费者
class ConsumerWithSynchronized implements Runnable {
    private ProductFactoryWithSynchronized productFactory;
    public ConsumerWithSynchronized(ProductFactoryWithSynchronized productFactory) {
        this.productFactory = productFactory;
    }
    public void run() {
        while (true) {
            productFactory.consume();
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


输出结果

线程(1号生产者)生产了一件产品:0;当前剩余商品1个
线程(1号消费者)消费了一件产品:0;当前剩余商品0个
警告:线程(2号消费者)准备消费产品,但当前没有产品
线程(1号生产者)生产了一件产品:1;当前剩余商品1个
线程(2号消费者)消费了一件产品:1;当前剩余商品0个
线程(1号生产者)生产了一件产品:2;当前剩余商品1个
线程(1号生产者)生产了一件产品:3;当前剩余商品2个
线程(1号生产者)生产了一件产品:4;当前剩余商品3个
线程(1号生产者)生产了一件产品:5;当前剩余商品4个
线程(1号生产者)生产了一件产品:6;当前剩余商品5个
线程(1号生产者)生产了一件产品:7;当前剩余商品6个
线程(1号生产者)生产了一件产品:8;当前剩余商品7个
线程(1号生产者)生产了一件产品:9;当前剩余商品8个
线程(1号生产者)生产了一件产品:10;当前剩余商品9个
线程(1号生产者)生产了一件产品:11;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(1号消费者)消费了一件产品:2;当前剩余商品9个
线程(1号生产者)生产了一件产品:12;当前剩余商品10个
线程(2号消费者)消费了一件产品:3;当前剩余商品9个
线程(1号生产者)生产了一件产品:13;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(1号消费者)消费了一件产品:4;当前剩余商品9个
线程(1号生产者)生产了一件产品:14;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(2号消费者)消费了一件产品:5;当前剩余商品9个
线程(1号生产者)生产了一件产品:15;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(1号消费者)消费了一件产品:6;当前剩余商品9个
线程(1号生产者)生产了一件产品:16;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(2号消费者)消费了一件产品:7;当前剩余商品9个
线程(1号生产者)生产了一件产品:17;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(1号消费者)消费了一件产品:8;当前剩余商品9个
线程(1号生产者)生产了一件产品:18;当前剩余商品10个
警告:线程(1号生产者)准备生产产品,但产品池已满
线程(2号消费者)消费了一件产品:9;当前剩余商品9个
原文地址http://www.bieryun.com/2512.html
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/573146

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。