多线程之多生产多消费者

import java.util.concurrent.locks.*;

public class Test23 {
	public static void main(String[] args) {
		Resource r = new Resource();
		String x = "黄焖鸡";

		PutX px = new PutX(r, x);
		TakeX tx = new TakeX(r, x);
		Thread t0 = new Thread(px);
		Thread t1 = new Thread(px);
		Thread t2 = new Thread(tx);
		Thread t3 = new Thread(tx);

		t0.start();
		t1.start();
		t2.start();
		t3.start();
	}
}

class Resource {

	Lock lock = new ReentrantLock();
	Condition full = lock.newCondition();
	Condition empty = lock.newCondition();

	private String[] item = new String[400];
	private int taker = 0;
	private int puter = 0;
	private int count = 0;

	public void put(String x) {
		while (true) {
			lock.lock();
			//用while不用if是因为当多个线程在这里等待后,被唤醒,需要重新判断这个条件
			while (count == item.length) {
				try {
					full.await();
				} catch (InterruptedException e) {
				}
			}
			item[puter] = x;
			System.out.println(Thread.currentThread().getName() + "..." + count
					+ "...put.." + x);
			if (puter == item.length - 1) {
				puter = -1;
				empty.signalAll();
			}
			++count;
			++puter;
			lock.unlock();
		}
	}

	public void take(String x) {
		while (true) {
			lock.lock();
			while (count == 0) {
				try {
					empty.await();
				} catch (InterruptedException e) {
				}
			}
			x = item[taker];
			System.out.println(Thread.currentThread().getName() + "..."
					+ (count - 1) + "..take......" + x);
			if (taker == item.length - 1) {
				taker = -1;
				full.signalAll();
			}
			--count;
			++taker;
			lock.unlock();
		}
	}
}

class PutX implements Runnable {
	Resource r;
	String x;

	PutX(Resource r, String x) {
		this.r = r;
		this.x = x;
	}

	public void run() {
		r.put(x);
	}
}

class TakeX implements Runnable {
	Resource r;
	String x;

	TakeX(Resource r, String x) {
		this.r = r;
		this.x = x;
	}

	public void run() {
		r.take(x);
	}
}

多线程之多生产多消费者,布布扣,bubuko.com

时间: 2024-11-05 13:39:50

多线程之多生产多消费者的相关文章

Java多线程之并发协作生产者消费者设计模式

两个线程一个生产者个一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性.常用的同步方法是采用标记或加锁机制 wait() / nofity() 方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制. wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行. notify

java中多线程通信实例:生产者消费者模式

线程间的通信: 其实就是多个线程再操作同一个资源,但是操作的动作不同   当某个线程进入synchronized块后,共享数据的状态不一定满足该线程的需要,需要其他线程改变共享数据的状态后才能运行,而由于当时线程对共享资源时独占的,它必须解除对共享资源的锁定的状态,通知其他线程可以使用该共享资源. Java中的 wait(),notify(),notifyAll()可以实现线程间的通信. 生产者--消费者问题是典型的线程同步和通信问题 /** * 生产者和消费者问题,生产者生成出产品,消费者去购

Java多线程学习笔记--生产消费者模式

实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前水平只能膜拜,本次只能算学习笔记,为了巩固自己对Java多线程常规知识点的理解,路过大神还望能指导指导.下面一段代码是最常规的生产者消费者的例子: package com.zhanglei.demo; import java.util.ArrayList; import java.util.List

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

java 多线程并发系列之 生产者消费者模式的两种实现

在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程.在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据.同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者.为了解决这种生产消费能力不均衡的问题,所以便有了生产者和消费者模式. 什么是生

java多线程中的生产者与消费者之等待唤醒机制@Version1.0

一.生产者消费者模式的学生类成员变量生产与消费demo,第一版1.等待唤醒:    Object类中提供了三个方法:    wait():等待    notify():唤醒单个线程    notifyAll():唤醒所有线程2.为什么这些方法不定义在Thread类中呢?  这些方法的调用必须通过锁对象调用,而我们刚才使用的锁对象是任意锁对象.  所以,这些方法必须定义在Object类中.3.当我们在使用多线程的时候有的时候需要,一条线程产生一个数据,另一条线程接着消费一个数据,一边生产一边消费,

Java多线程与并发——生产者与消费者应用案例

多线程的开发中有一个最经典的操作案例,就是生产者-消费者,生产者不断生产产品,消费者不断取走产品. package com.vince; /** * 生产者与消费者案例 * @author Administrator * */ public class ThreadDemo4 { public static void main(String[] args) { // TODO 自动生成的方法存根 Food food=new Food(); Producter p=new Producter(fo

转----秒杀多线程第十篇 生产者消费者问题

继经典线程同步问题之 后,我们来看看生产者消费者问题及读者写者问题.生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给 若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从 缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中 再次投放产品. 这个生产者消费者题目不仅

多线程设计模式:Producer-Consumer生产者-消费者模式的C++

我们这里介绍的Producer-Consumer生产者-消费者模式是多线程设计模式中很著名的一个设计模式.说到生产者消费者问题,大部分人都不会陌生,OS课的经典问题,并且其本身就是一个计算机编程中常见的问题.对于它的应用,可以举出无数的例子,小到一个多线程程序对队列的共享互斥操作,大到目前流行的中间件产品,诸如BEA的BMQ(BEA Message Queue),IBM的MQ Serious等中间件就是将生产者消费者问题应用通用化体系化的结果. 实际上,生产者消费者模式跟我们之前的多线程设计模式