- 浏览: 370178 次
- 性别:
- 来自: 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 1148<!-- 配置异步线程执行器 --> < ... -
java synchronized与lock区别 转
2013-03-20 01:59 1053java synchronized与lock区别 ... -
java并发编程实践笔记(转)
2012-11-28 01:14 932一、 保证线程安全的 ... -
并发集合类ConcurrentSkipListSet
2012-11-24 03:26 5617ConcurrentSkipListSet Concu ... -
Amdahl 定律 (阿姆达尔定律)
2012-11-24 02:14 2064有些问题使用越多的资源就能越快地解决——越多的工人参 ... -
java线程内存模型,线程、工作内存、主内存
2012-11-24 02:08 18186java线程内存模型 线程、工作内存、主内存三者之间的 ... -
线程同步与异步
2012-11-22 23:53 2476Java中的线程同步与 ... -
Java 并发核心编程(转)
2012-11-06 10:16 1021Java 并发核心编程(转) Java 并发核心编程 ... -
java线程:关于Callable和Future的简单使用:有返回值的线程
2012-11-06 09:19 1965分类: java_线程2012-07-03 19 ... -
java数据结构:ConcurrentSkipListSet<E>与CopyOnWriteArraySet<E>
2012-11-06 09:20 5862分类: java_数据结构 java_线程201 ... -
java线程:信号量
2012-11-06 09:20 881Java 信号量 Semaphore 介绍 Semaphore ... -
java线程:一个死锁的小程序
2012-11-06 09:20 2700死锁是这样一种 ... -
java线程:互斥锁与读写锁
2012-11-05 17:34 7048java线程:互斥锁与读写锁 分类: ja ... -
java线程:三种方式实现生产者消费者问题_3
2012-11-05 17:34 1305java线程:三种方式 ... -
java线程:几个实用的线程工具类
2012-11-05 15:15 8363java线程:几个实用的线程工具类 分类: ... -
java线程:三种方式实现生产者消费者问题_1
2012-11-05 14:22 1147java线程:三种方式实现生产者消费者问题_1 ... -
java ExecutorService 线程池Callable 和 Future接口
2012-08-29 21:10 1167javaEye转载(java多线程 Callable 的实现) ... -
线程并发
2012-03-31 15:41 10411:>内存模型 究竟什么是内存模型?内存模型描述了程序中 ... -
特殊的队列:BlockingQueue 使用(转)
2012-03-28 14:49 1059本例介绍一个特殊的队列:BlockingQueue,如果Blo ... -
Spring 线程池使用
2012-03-28 12:47 26087Spring 线程池使用 /** * */ 一个日志管理 ...
相关推荐
`BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...
本示例中的“生产者-消费者”模型是一种经典的多线程问题,它模拟了实际生产环境中的资源分配与消耗过程。下面我们将详细探讨如何在Java中实现这个模型。 首先,我们要理解生产者-消费者模型的基本概念。在这个模型...
在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
用java多线程,实现生产者消费者同步和互斥的问题,操作系统中的经典问题
基本满足操作系统课上要求,java实现的生产者消费者模型。
在实际应用中,我们常常会遇到一种典型的多线程问题——生产者消费者模型。这个模型描述了两种类型的线程:生产者线程负责创建或生产资源,而消费者线程则负责消耗这些资源。在Java中,我们可以利用同步机制来实现...
java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...
java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...
4. **阻塞队列(BlockingQueue)**:Java并发包(java.util.concurrent)中的阻塞队列是实现生产者消费者模式的理想选择。它们在内部已经处理了线程同步和等待,提供了一种高效且安全的共享数据方式。例如,`put()`...
用Java实现消费者与生产者两个线程进行调度
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
Java线程实现的生产者和消费者程序是一种经典的多线程设计模式,用于处理并发操作中的数据共享问题。这种模式在实际编程中广泛应用,特别是在需要高效处理数据流和资源管理的系统中。以下将详细讲解其核心概念、实现...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
- `BlockingQueue` 是JAVA集合框架的一部分,提供了一个线程安全的方式来实现生产者/消费者模型。 - 它提供了`put()` 和 `take()` 等方法,这些方法会在队列满或空时自动阻塞当前线程,直到条件满足为止。 使用`...
生产者与消费者问题在计算机科学中是一个经典的多线程同步问题,主要涉及到进程间的通信和资源的共享。在Java中,我们通常通过`wait()`、`notify()`和`notifyAll()`这三个方法,以及`synchronized`关键字来解决这个...
生产者-消费者模式是一种经典的多线程设计模式,用于解决数据共享问题,尤其是在一个线程生产数据而另一个线程消费数据的情况下。在这个模式中,生产者负责生成数据并放入共享的数据结构(如队列),而消费者则从这...
Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...