生产者——消费者模型的java代码实现
生产者
import java.util.Random;
public class Producer extends Thread {
private Storage<Product> storage;
public Producer(Storage<Product> storage) {
this.storage = storage;
}
@Override
public void run() {
produce();
}
private void produce() {
while (true) {
Product product = new Product(new Random().nextInt(100));
storage.enStorage(product);
}
}
}
消费者
public class Consumer extends Thread {
private Storage<Product> storage;
public Consumer(Storage<Product> storage) {
this.storage = storage;
}
@Override
public void run() {
consume();
}
private void consume() {
while (true) {
storage.deStorage();
}
}
}
产品
/**
* 产品
*
* @author thief
*
*/
public class Product { private int id; public Product(int id) {
this.id = id;
} @Override
public String toString() {
return "产品:" + id;
} }
仓库
import java.util.ArrayList;
import java.util.List; /**
* 仓库
*
* @author Thief
*
* @param <E>
*/
public class Storage<E> { private List<E> list = new ArrayList<E>(); /**
* 入仓
*
* @param e
*/
public void enStorage(E e) {
synchronized (list) {
while (this.isFull()) {
try {
System.out.println("仓库已满");
list.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
list.add(e);
System.out.println(Thread.currentThread().getName() + "生产产品");
try {
Thread.sleep(10);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
list.notifyAll();
}
} /**
* 出仓
*
* @param e
*/
public E deStorage() {
synchronized (list) {
while(this.isEmpty()) {
try {
System.out.println("仓库已空");
list.wait();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
E e = list.get(0);
list.remove(0);
System.out.println(Thread.currentThread().getName() + "消费产品");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
list.notifyAll();
return e;
}
} /**
* 判断当前仓库是否为空
*
* @return
*/
public boolean isEmpty() {
return list.isEmpty();
} /**
* 判断当前仓库是否已满
*
* @return
*/
public boolean isFull() {
return list.size() == 5;
} }
测试代码
public class Test {
public static void main(String[] args) {
Storage<Product> storage = new Storage<Product>();
new Producer(storage).start();
new Consumer(storage).start();
}
}
生产者——消费者模型的java代码实现的更多相关文章
- 结合生活,剖析《生产者消费者模型》-java多线程(一)
博客园的园友们好,看博客园上各位大佬的文章,已陪伴了我程序员职业的三年, 如今自己同样希望能把自己从小白到菜鸟的成长过程分享给大家.不定期更新!!! 首先我本人智商不高,理解问题十分吃力,完全不属于天 ...
- 转: 【Java并发编程】之十三:生产者—消费者模型(含代码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17249321 生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一 ...
- Linux同步互斥(Peterson算法,生产者消费者模型)
同步 两个或两个以上随时间变化的量在变化过程中保持一定的相对关系. 互斥 对一组并发进程,一次只有一个进程能够访问一个给定的资源或执行一个给定的功能. 互斥技术可以用于解决诸如资源争用之类的冲突,还可 ...
- python2.0_s12_day9之day8遗留知识(queue队列&生产者消费者模型)
4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 * 6.queue队列 * 7.生产者消费者模型 4.6 queue队列 que ...
- 生产者消费者模型-Java代码实现
什么是生产者-消费者模式 比如有两个进程A和B,它们共享一个固定大小的缓冲区,A进程产生数据放入缓冲区,B进程从缓冲区中取出数据进行计算,那么这里其实就是一个生产者和消费者的模式,A相当于生产者,B相 ...
- 第23章 java线程通信——生产者/消费者模型案例
第23章 java线程通信--生产者/消费者模型案例 1.案例: package com.rocco; /** * 生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二, ...
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...
- Java生产者消费者模型
在Java中线程同步的经典案例,不同线程对同一个对象同时进行多线程操作,为了保持线程安全,数据结果要是我们期望的结果. 生产者-消费者模型可以很好的解释这个现象:对于公共数据data,初始值为0,多个 ...
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视.本文对这些关键字的使用进行了描述. 在 Java 中可以用 wait ...
随机推荐
- 使用 Apple Configurator 2 获取ipa文件
如今很多人想要获取到App Store上的包却苦于无奈,先在要把App Store上的包载下来获取ipa,最直接的就是从手机设备上导出了,但是手机必须要9.0以下才可以导出,鄙人手中正好有公司的测试机 ...
- GoldenGate Lag For Huge Insert
前些天客户的ogg延迟到达8小时左右.于是我当时用logdump追踪了一下: 看进程状态: send extsa staus EXTRACT ZBDBA (PID 2269368) Current s ...
- StandardServer.await: create[8005]java.net.BindException: Address already in use: JVM_Bind错误
StandardServer.await: create[8005]java.net.BindException: Address already in use: JVM_Bind错误. 原因是:To ...
- EntityFramework.SqlServer.dll 中发生 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: Named Pipes Provider, error: 40 - 无法打开到 SQL Server 的连接)
解决方案: 1.打开Sql server 管理配置器 或者在命令行输入:SQLServerManager10.msc 2.点击MSSQLSERVER的协议,在右侧的页面中选择TCP/IP协议启用 3. ...
- redis主从持久化讨论
Redis有两种持久化方式,AOF和RDB,AOF持久化是指追加写命令到aof文件的方式,RDB是指定期保存内存快照到rdb文件的方式. RDB虽然可以通过bgsave指令后台保存快照,但fork() ...
- unity, UGUI Text fadeIn
错误写法: Color color = m_text.GetComponent<Text> ().color; Color startColor = new Color (c ...
- 转:NHibernate 存储过程
http://stackoverflow.com/questions/928847/how-to-get-the-return-value-from-a-sql-server-stored-proce ...
- 内核调试神器SystemTap — 探測点与语法(二)
a linux trace/probe tool. 官网:https://sourceware.org/systemtap/ 探測点 SystemTap脚本主要是由探測点和探測点处理函数组成的,来看下 ...
- 初识Quartz(二)
简单作业: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package quartz_pr ...
- MySQL修改参数不重启生效
地球人都知道,更新mysql配置my.cnf需要重启mysql才能生效,但是有些时候mysql在线上,不一定允许你重启,这时候应该怎么办呢? 看一个例子:mysql> show variable ...