-
一个java生产者消费者代码的问题5
一个生产者消费者的代码,使用lock和condition实现。
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; //生产/消费者模式 public class Basket { Lock lock = new ReentrantLock(); // 产生Condition对象 Condition produced = lock.newCondition(); Condition consumed = lock.newCondition(); boolean available = false; public void produce() throws InterruptedException { lock.lock(); try { if (available) { produced.await(); // 放弃lock进入睡眠 } System.out.println("Apple produced."); available = true; consumed.signal(); // 发信号唤醒等待这个Condition的线程 } finally { lock.unlock(); } } public void consume() throws InterruptedException { lock.lock(); try { if (!available) { consumed.await(); // 放弃lock进入睡眠 } /* 吃苹果 */ System.out.println("Apple consumed."); available = false; produced.signal(); // 发信号唤醒等待这个Condition的线程 } finally { lock.unlock(); } } }
import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; //测试用类 public class ConditionTester { public static void main(String[] args) throws InterruptedException { final Basket basket = new Basket(); // 定义一个producer Runnable producer = new Runnable() { public void run() { try { basket.produce(); } catch (InterruptedException ex) { ex.printStackTrace(); } } }; // 定义一个consumer Runnable consumer = new Runnable() { public void run() { try { basket.consume(); } catch (InterruptedException ex) { ex.printStackTrace(); } } }; // 各产生10个consumer和producer ExecutorService service = Executors.newCachedThreadPool(); for (int i = 0; i < 4; i++) service.submit(consumer); Thread.sleep(2000*2); for (int i = 0; i < 4; i++) service.submit(producer); service.shutdown(); } }
以上代码我觉的执行结果应该是一个Apple prodeced 跟着一个App consumed, 就是说如果生产一个苹果,那么它应该立即被消费掉,但是实际的执行结果却不一定,有时候的执行结果为:Apple produced. Apple consumed. Apple produced. Apple produced. Apple consumed. Apple consumed. Apple produced. Apple consumed.
出现了连续生产两次苹果,我想问问大牛们是这是什么原因啊?2013年6月24日 21:20
6个答案 按时间排序 按投票排序
-
采纳的答案
跟406657836 说的类似,但还是不完全一样;
答案及解决方案在:
http://jinnianshilongnian.iteye.com/blog/18936902013年6月25日 07:36
-
除了if (!available)这种错误用法外,楼主的代码有个更严重的问题:会卡死。因为很可能出现两个producer或者两个consumer同时wait的情况。只用consumer和producer线程都只有一个的情况下才不会卡死。
2013年6月25日 08:56
-
关于这类问题,我在csdn上有篇博客。是一道阿里巴巴的面试题,和你这个是一个类型的题目。你可以去看下。
http://blog.csdn.net/liguogangde/article/details/9103501
发生问题的原理是一样的。就不重复叙述了呵!2013年6月25日 00:44
-
boolean available = false; 加个volatile试一下,应该是值变了但线程的工作内存没检测到值的变化
2013年6月25日 00:44
相关推荐
Java生产者消费者问题是多线程编程中的一个经典问题,它主要涉及到线程间的协作与通信。在并发编程中,生产者负责生成数据,而消费者则负责处理这些数据。为了解决生产者和消费者之间的问题,Java提供了一系列的同步...
Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...
Java 生产者消费者问题代码实现 Java 生产者消费者问题是计算机科学中的一种经典同步问题,它描述了多个生产者和消费者之间的关系,生产者负责生产数据,而消费者负责消费数据。在解决这个问题时,需要使用同步机制...
在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...
9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...
在这个"java生产者消费者demo"中,开发者使用了适配器模式来构建解决方案。适配器模式是一种设计模式,它允许不同接口的类协同工作,即使它们原本无法直接交互。在生产者消费者问题中,适配器模式可能被用来协调生产...
在这个名为"producerandconsumer3"的代码中,我们可能看到一个具体的实现,它可能包括两个类,一个代表生产者,一个代表消费者。它们都继承自`Thread`类,并重写`run()`方法来执行各自的逻辑。生产者的`run()`方法会...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
生产者消费者问题是多线程编程中的一个经典案例,主要展示了线程间的同步和通信。在Java中,我们可以通过使用`java.util.concurrent`包中的工具类来解决这个问题。本项目使用GUI(图形用户界面)和控制台输出展示了...
在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...
在 main 方法中,我们创建了一个生产者消费者对象,并将其添加到窗口中。然后,我们使用一个循环来创建多个.JTextField 组件,并将其添加到面板上。这些 JTextField 组件将用来显示缓冲池中的数据。 三、缓冲池的...
生产者-消费者问题是多线程编程中常见的同步问题,它涉及到如何在多个生产者和消费者之间共享有限资源的问题。在这个场景中,生产者负责生成数据(产品),而消费者则负责消费这些数据。为了保证系统的稳定运行,...
### Java生产者消费者问题知识点详解 #### 一、实验背景及意义 生产者-消费者问题是计算机科学中的一个经典问题,通常用于演示并发编程中的同步机制。这个问题涉及到如何在多个线程之间分配有限资源的问题,是多...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
在Java编程领域,生产者消费者问题是多线程同步的一个经典示例,它源自并发编程中的一个常见场景。这个问题描述了两个角色:生产者和消费者,它们共享一个有限大小的缓冲区。生产者负责生成数据并将数据放入缓冲区,...
在生产者消费者问题的Java实现中,通常会使用一个有界缓冲区来存储数据。这个缓冲区可以用数组或`BlockingQueue`来实现。`BlockingQueue`是一个线程安全的数据结构,它内置了同步机制,可以避免死锁和资源浪费。 ...
在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...
总结来说,这个程序设计了一个基于Java的生产者-消费者问题的可视化解决方案,利用多线程和进程同步机制来模拟车库(缓冲区)中数据的生产与消耗过程。通过图形用户界面,用户可以直观地看到生产者和消费者如何在...