0 0

一个生产者和多个消费者的互斥问题3

运行后,消费者一直处于waiting状态,请问该怎么解决
我的想法:
生产者,因为使用list存放数据,直接添加数据就好;而消费者使用后,再删除使用数据
List<String> licenses = (ArrayList<String>)obj;
		pool.addLicenses(licenses);

消费者线程,其中pool为数据池:
	
public void run() {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss:SS");
		TimeZone t = sdf.getTimeZone();
		t.setRawOffset(0);
		sdf.setTimeZone(t);

		synchronized(pool) {
			while (true) {
				String license = pool.getLicense();
				System.out.println("Get "+license);
			}
		}

以下是数据池,使用list存放数据
package com.traffic.cache;

import java.util.ArrayList;
import java.util.List;
public class LicensePool {
	
	private List<String> licenses = new ArrayList<String>();
	
	public LicensePool() {
	}
	public synchronized void addLicenses(List<String> license) {
		licenses.addAll(license);
		notifyAll();
	}
	
	public synchronized String getLicense(){
		        
        while(!haveLicense()) {
        	try {
        		System.out.println("Waiting");
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
		String l = licenses.get(0);
		System.out.println(l);
		licenses.remove(0);
		return l;
	}
	
	public boolean haveLicense() {
		if(licenses.isEmpty()){
			return false;
		}
		return true;
	}
	
	public int getSize() {
		return licenses.size();
	}
}
2012年4月25日 11:26

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

0 0

采纳的答案

引用
synchronized(pool) {
锁没释放
addLicenses是执行不了的
引用
while(!haveLicense()) {  
一直为空

2012年4月25日 16:50
0 0

应该在LicensePool 内部对

引用
private List<String> licenses
做锁同步,外面就可以不用
引用
synchronized(pool) {

2012年4月25日 16:51

相关推荐

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    a: 创建一个线程 ...h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more 生产者消费者问题 (1生产者 2消费者 4缓冲区) problem2 读者与写着问题 I: 信号量 semaphore 解决线程同步问题

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

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

    操作系统实验之进程的互斥与同步(生产者与消费者问题)VC++

    为了保证数据的一致性,必须确保在任何时候,缓冲区要么只允许一个生产者写入,要么只允许一个消费者读取,不能同时进行。 **进程的同步**则是指控制多个进程的执行顺序,使得进程间能有效地协调工作。在生产者与...

    进程同步与互斥 生产者与消费者问题--操作系统大作业

    生产者-消费者问题是一个经典的进程同步问题,涉及到两个进程(或线程)——生产者和消费者。生产者负责生产数据项并将其放入一个共享缓冲区,而消费者则从这个缓冲区中取出数据项进行处理。为了保证正确性,需要...

    模拟操作系统的进程同步与互斥(生产者—消费者问题)

    这个模拟操作系统的进程同步与互斥问题是根据生产者-消费者问题来实现的。...在这个问题中,我们使用了各种变量和结构体来存储线程的信息,并使用了多个函数来实现生产者线程和消费者线程的生成和操作。

    操作系统同步和互斥(生产者和消费者问题)

    **生产者和消费者问题**是一个典型的多线程同步问题。在这个问题中,"生产者"线程负责生成数据并放入缓冲区,而"消费者"线程则负责从缓冲区取出并处理数据。关键在于,当缓冲区满时,生产者必须停止生产;当缓冲区空...

    生产者与消费者问题

    假设M个生产者和N个消费者共享一个具有K(K大于1)个缓冲区的循环缓冲结构BUFFER(提示:可以用一个循环...当无满缓冲区时消费者线程阻塞,并且多个生产者线程对IN的使用必须互斥,多个消费者线程对OUT的使用也必须互斥

    生产者消费者问题

    问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者...

    生产者消费者问题(缓冲区互斥,临界区)

    生产者-消费者问题是并发编程中的一个重要概念,它不仅体现了多线程间的协作关系,还展示了如何通过互斥锁和信号量等机制来实现资源的有效管理和利用。通过理解和掌握这一模式,开发者可以更好地设计出高效、稳定的...

    生产者消费者的c++代码实现

    在这个问题中,生产者线程和消费者线程之间存在着竞争关系,生产者线程需要等待消费者线程释放出一个空缓冲区,消费者线程需要等待生产者线程生产出新的物品。为了解决这个问题,需要使用同步机制来控制线程之间的...

    四川大学操作系统课程设计高分报告-第三次实验-生产者和消费者问题.doc

    该问题旨在模拟一个系统,其中多个生产者线程生产产品,而多个消费者线程消费这些产品,同时需要确保生产与消费的同步,防止缓冲区溢出或空洞。 描述中提到,这份报告是作者认真完成的,所有题目正确无误,最终获得...

    利用记录型信号量解决生产者-消费者问题.doc

    在计算机科学中,生产者-消费者问题是一个经典的同步问题,描述了多个进程之间的协作和资源竞争。在这里,我们将讨论使用记录型信号量解决生产者-消费者问题的方法。 生产者-消费者问题 生产者-消费者问题是一个...

    多进程同步解决生产者消费者问题(c++源码)

    3. **共享缓冲区操作**:多个生产者或多个消费者之间需要有共享对缓冲区进行操作的函数代码。 #### 三、实现原理与代码解析 本节将详细介绍如何使用C++语言中的多进程同步机制来实现上述功能。 #### 1. 基础数据...

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计

    C语言信号量同步与互斥生产者消费者互斥锁读写者问题哲学家就餐问题课程设计 本课程设计旨在通过C语言编程来解决信号量机制下的同步、互斥、生产者消费者问题、哲学家就餐问题和读写者问题。 一、信号量机制 信号...

    线程间资源互斥与通信(生产者消费者)

    在生产者消费者问题中,我们可以设置信号量的初始值为队列的最大容量,生产者每添加一个元素,信号量减1;消费者每消费一个元素,信号量加1。 3. **条件变量(Condition)**:Java的`java.util.concurrent.locks....

    操作系统课程设计生产者和消费者问题源代码

    ②从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并...

    linux下用多进程同步方法解决生产者-消费者问题源代码

    生产者-消费者问题是计算机科学中的一个经典同步问题,主要探讨如何在多个进程中有效地共享有限的资源,以防止数据竞争和死锁的发生。在Linux操作系统环境下,这个问题通常通过信号量(semaphore)或管道(pipe)等...

    生产者-消费者问题.cpp

    该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放...

Global site tag (gtag.js) - Google Analytics