-
一个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生产者消费者问题代码实现
java的生产者消费者,thread生产者消费者、。。。。。。
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...
用java编写,模拟生产者消费者问题,生产一个消费一个!
java实现生产者消费者,生产者先生产,然后通知消费者消费,然后再通知生产者生产
生产者消费者问题,描述一组生产者向一组消费者提供产品/消息。它们共享一个有界缓冲区,生产者向其中放产品/消息,消费者从中取产品/消息。只要缓冲区未满,生产者可放产品/消息,只要缓冲区有数据,消费者可取消息...
设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制. 说明:有界缓冲区内设有20个存储单元,放入/取出的数据项设定为1-20这20个整型数. 设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后...
java多线程实现生产者和消费者
os课程设计、通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制
本代码是用JAVA实现的生产者与消费者的问题,线程间的同步与互斥功能
用 GUI 实现生产者消费者问题,很直观,CMD 下也有显示 不是用 eclipse 编写,所有不是工程文件,在 CMD 下运行 Main.java 即可
使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)
利用Java多线程实现的操作系统的生产者与消费者算法,主要用到了线程的同步,等待与唤醒操作。
多个生产者与多个消费者共用资源,用java代码实现,操作系统的实验,还有报告,下次再发
java线程之简单的生产者消费者代码,没有太多注释。这个是store部分,生产者消费者自己可以简单写一个。
操作系统生产者与消费者java源代码,使用Java图形用户界面实现。
操作系统 生产者消费者问题 Java代码产者消费者问题,描述一组生产者向一组消费者提供产品.zip
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...