0 0

一个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.


出现了连续生产两次苹果,我想问问大牛们是这是什么原因啊?

6个答案 按时间排序 按投票排序

0 0

采纳的答案

跟406657836 说的类似,但还是不完全一样;
答案及解决方案在:
http://jinnianshilongnian.iteye.com/blog/1893690

2013年6月25日 07:36
0 0

更正,我的卡死的说法是错误的,楼主的代码不会导致卡死。

2013年6月25日 10:19
0 0

除了if (!available)这种错误用法外,楼主的代码有个更严重的问题:会卡死。因为很可能出现两个producer或者两个consumer同时wait的情况。只用consumer和producer线程都只有一个的情况下才不会卡死。

2013年6月25日 08:56
0 0

if (!available) 问题应该在这里,这种用法是错误的,把if改成while。

2013年6月25日 08:28
0 0

关于这类问题,我在csdn上有篇博客。是一道阿里巴巴的面试题,和你这个是一个类型的题目。你可以去看下。
http://blog.csdn.net/liguogangde/article/details/9103501
发生问题的原理是一样的。就不重复叙述了呵!

2013年6月25日 00:44
0 0

boolean available = false;  加个volatile试一下,应该是值变了但线程的工作内存没检测到值的变化

2013年6月25日 00:44

相关推荐

    java生产者消费者问题

    Java生产者消费者问题是多线程编程中的一个经典问题,它主要涉及到线程间的协作与通信。在并发编程中,生产者负责生成数据,而消费者则负责处理这些数据。为了解决生产者和消费者之间的问题,Java提供了一系列的同步...

    java生产者消费者

    Java生产者消费者模式是一种多线程设计模式,它在并发编程中被广泛使用,用于解决资源的共享问题。在这个模式中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。它们通过一个共享的数据缓冲区进行通信,避免...

    java生产者消费者问题代码实现

    Java 生产者消费者问题代码实现 Java 生产者消费者问题是计算机科学中的一种经典同步问题,它描述了多个生产者和消费者之间的关系,生产者负责生产数据,而消费者负责消费数据。在解决这个问题时,需要使用同步机制...

    java实现生产者消费者

    在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...

    java多线程实现生产者和消费者

    9. **测试与调试**:多线程问题往往难以复现,因此在编写生产者-消费者代码时,应编写充分的测试用例,包括边界情况,如缓冲区满和空的状态转换。 通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者...

    java生产者消费者demo

    在这个"java生产者消费者demo"中,开发者使用了适配器模式来构建解决方案。适配器模式是一种设计模式,它允许不同接口的类协同工作,即使它们原本无法直接交互。在生产者消费者问题中,适配器模式可能被用来协调生产...

    操作系统生产者与消费者问题Java简单模拟实现

    在这个名为"producerandconsumer3"的代码中,我们可能看到一个具体的实现,它可能包括两个类,一个代表生产者,一个代表消费者。它们都继承自`Thread`类,并重写`run()`方法来执行各自的逻辑。生产者的`run()`方法会...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    生产者消费者问题 Java

    生产者消费者问题是多线程编程中的一个经典案例,主要展示了线程间的同步和通信。在Java中,我们可以通过使用`java.util.concurrent`包中的工具类来解决这个问题。本项目使用GUI(图形用户界面)和控制台输出展示了...

    Java 生产者消费者模式

    在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...

    操作系统生产者与消费者java源代码

    在 main 方法中,我们创建了一个生产者消费者对象,并将其添加到窗口中。然后,我们使用一个循环来创建多个.JTextField 组件,并将其添加到面板上。这些 JTextField 组件将用来显示缓冲池中的数据。 三、缓冲池的...

    生产者消费者问题java的java编写的

    生产者-消费者问题是多线程编程中常见的同步问题,它涉及到如何在多个生产者和消费者之间共享有限资源的问题。在这个场景中,生产者负责生成数据(产品),而消费者则负责消费这些数据。为了保证系统的稳定运行,...

    java生产者消费者问题 实验报告

    ### Java生产者消费者问题知识点详解 #### 一、实验背景及意义 生产者-消费者问题是计算机科学中的一个经典问题,通常用于演示并发编程中的同步机制。这个问题涉及到如何在多个线程之间分配有限资源的问题,是多...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    Java生产者消费者问题

    在Java编程领域,生产者消费者问题是多线程同步的一个经典示例,它源自并发编程中的一个常见场景。这个问题描述了两个角色:生产者和消费者,它们共享一个有限大小的缓冲区。生产者负责生成数据并将数据放入缓冲区,...

    生产者消费者问题 Java实现

    在生产者消费者问题的Java实现中,通常会使用一个有界缓冲区来存储数据。这个缓冲区可以用数组或`BlockingQueue`来实现。`BlockingQueue`是一个线程安全的数据结构,它内置了同步机制,可以避免死锁和资源浪费。 ...

    Java生产者与消费者

    在Java编程中,"生产者与消费者"模式是一种经典的多线程问题,它涉及到了并发处理和资源管理。这个模式的核心思想是通过共享一个有限的缓冲区,使得生产者线程可以将产品放入缓冲区,而消费者线程则可以从缓冲区取出...

    生产者 消费者 进程 可视化 java

    总结来说,这个程序设计了一个基于Java的生产者-消费者问题的可视化解决方案,利用多线程和进程同步机制来模拟车库(缓冲区)中数据的生产与消耗过程。通过图形用户界面,用户可以直观地看到生产者和消费者如何在...

Global site tag (gtag.js) - Google Analytics