- 浏览: 364822 次
- 性别:
- 来自: Alien
文章分类
最新评论
-
风一样的男人__:
[flash=200,200][url]引用[/url][/f ...
java线程内存模型,线程、工作内存、主内存 -
极乐君:
厉害了,,,请问可以转载到我们专栏吗?会注明来源和地址的~专栏 ...
java线程内存模型,线程、工作内存、主内存 -
zdd001:
Spring 线程池使用 -
zdd001:
Spring 线程池使用 -
u014663756:
看了三行就知道是我想要的!!
java线程内存模型,线程、工作内存、主内存
上一种方式是采用synchronized关键字实现生产者消费者的问题,那是传统的做法,现在采用jdk1.5语法的新增的并发机制实现,以下是仓库类的具体代码实现(生产者类、消费者类类均不变,请参考上一篇文章:《三种方式实现生产者消费者_1》)。
[java] view plaincopy
- <span style="font-family:Arial;">
- /**
- * 仓库:
- * 先生产的先消费:使用队列的方式实现
- */
- public class Storage {
- public static final int MAX_SIZE = 100; // 仓库的最大货存
- // 容器,为了使用方便,没有面向接口编程,使用LinkedList作为实现类
- private LinkedList<Object> container = new LinkedList<Object>();
- private Lock lock = new ReentrantLock(); // 互斥锁,相当于synchronized
- private Condition getCondition = lock.newCondition();
- private Condition putCondition = lock.newCondition();
- // 往仓库中存放一个产品:
- public void put(){
- lock.lock();
- try {
- while(container.size() == MAX_SIZE){
- putCondition.await();// 生产者等待,并让消费者唤醒
- }
- sop("put()等待结束,仓库现有数量为"+ container.size() +", 开始生产");
- /*
- * 试想一下:如果换成这种做法会有什么弊端:
- * int size = storage.size();
- * sop("put()等待结束,仓库现有数量为"+ size +", 开始生产");
- * while(size == MAX_SIZE){
- * putCondition.await();
- * }
- * ...
- */
- container.addLast(new Object());
- //通知消费者消费
- getCondition.signal();
- } catch(Exception e){
- throw new RuntimeException(e);
- } finally {
- lock.unlock(); // 释放资源
- }
- }
- // 从仓库中取出一个产品:
- public void get(){
- lock.lock();
- try {
- while(container.size() == 0){
- // 消费者等待,并让生产者唤醒
- getCondition.await();
- }
- sop("get()等待结束,仓库现有数量为"+ container.size() +", 开始消费");
- Object obj = container.removeLast();
- // 通知生产者生产
- putCondition.signal();
- Thread.sleep(1000);
- } catch(Exception e){
- throw new RuntimeException(e);
- } finally {
- lock.unlock();
- }
- }
- private static void sop(Object obj){
- System.out.println(obj);
- }
- }
- </span>
[java] view plaincopy
- <span style="font-family:Arial;">public class Test {
- public static void main(String[] args) {
- Storage storage = new Storage();
- Consumer con = new Consumer(storage);
- Producer pro = new Producer(storage);
- new Thread(pro).start();
- new Thread(pro).start();
- // new Thread(pro).start();
- // new Thread(pro).start();
- // new Thread(con).start();
- new Thread(con).start();
- new Thread(con).start();
- new Thread(con).start();
- new Thread(con).start();
- }
- }
- </span>
测试结果:
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
put()等待结束,仓库现有数量为1, 开始生产
get()等待结束,仓库现有数量为2, 开始消费
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
put()等待结束,仓库现有数量为0, 开始生产
get()等待结束,仓库现有数量为1, 开始消费
发表评论
-
Spring 线程池使用2
2013-04-25 18:41 1109<!-- 配置异步线程执行器 --> < ... -
java synchronized与lock区别 转
2013-03-20 01:59 1014java synchronized与lock区别 ... -
java并发编程实践笔记(转)
2012-11-28 01:14 903一、 保证线程安全的 ... -
并发集合类ConcurrentSkipListSet
2012-11-24 03:26 5579ConcurrentSkipListSet Concu ... -
Amdahl 定律 (阿姆达尔定律)
2012-11-24 02:14 2030有些问题使用越多的资源就能越快地解决——越多的工人参 ... -
java线程内存模型,线程、工作内存、主内存
2012-11-24 02:08 18103java线程内存模型 线程、工作内存、主内存三者之间的 ... -
线程同步与异步
2012-11-22 23:53 2439Java中的线程同步与 ... -
Java 并发核心编程(转)
2012-11-06 10:16 981Java 并发核心编程(转) Java 并发核心编程 ... -
java线程:关于Callable和Future的简单使用:有返回值的线程
2012-11-06 09:19 1924分类: java_线程2012-07-03 19 ... -
java数据结构:ConcurrentSkipListSet<E>与CopyOnWriteArraySet<E>
2012-11-06 09:20 5801分类: java_数据结构 java_线程201 ... -
java线程:信号量
2012-11-06 09:20 842Java 信号量 Semaphore 介绍 Semaphore ... -
java线程:一个死锁的小程序
2012-11-06 09:20 2679死锁是这样一种 ... -
java线程:互斥锁与读写锁
2012-11-05 17:34 7001java线程:互斥锁与读写锁 分类: ja ... -
java线程:三种方式实现生产者消费者问题_3
2012-11-05 17:34 1277java线程:三种方式 ... -
java线程:几个实用的线程工具类
2012-11-05 15:15 8325java线程:几个实用的线程工具类 分类: ... -
java线程:三种方式实现生产者消费者问题_1
2012-11-05 14:22 1124java线程:三种方式实现生产者消费者问题_1 ... -
java ExecutorService 线程池Callable 和 Future接口
2012-08-29 21:10 1111javaEye转载(java多线程 Callable 的实现) ... -
线程并发
2012-03-31 15:41 10151:>内存模型 究竟什么是内存模型?内存模型描述了程序中 ... -
特殊的队列:BlockingQueue 使用(转)
2012-03-28 14:49 1025本例介绍一个特殊的队列:BlockingQueue,如果Blo ... -
Spring 线程池使用
2012-03-28 12:47 26045Spring 线程池使用 /** * */ 一个日志管理 ...
相关推荐
java多线程实现生产者和消费者
编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
基本满足操作系统课上要求,java实现的生产者消费者模型。
用java多线程简易实现生产者消费者模式的代码,用java多线程简易实现生产者消费者模式的代码。
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释...Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
java多线程实现生产者消费者关系,完成线程之间的同步。
用Java实现消费者与生产者两个线程进行调度
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
java线程实现的生产者和消费者的程序java线程实现的生产者和消费者的程序
生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信生产者消费者问题 Java实现 线程同步 线程通信