`

Thread生产者消费者例子

阅读更多
引用

java多线程一般都会讲消费者-生产者模型

生产者与消费者模型中,要保证以下几点:
1 同一时间内只能有一个生产者生产
2 同一时间内只能有一个消费者消费
3 生产者生产的同时消费者不能消费
4 消息队列满时生产者不能继续生产
5 消息队列空时消费者不能继续消费


[size=small]package com.yss.test.thread;

import java.util.ArrayList;
import java.util.List;

public class Producer_Consumer_Test {
	public static void main(String[] args) {

		Queue Q = new Queue();

		Producer wQ1 = new Producer(Q);
		Producer wQ2 = new Producer(Q);
		Producer wQ3 = new Producer(Q);
//		Producer wQ4 = new Producer(Q);
//		Producer wQ5 = new Producer(Q);
		
		Consumer rQ1 = new Consumer(Q);
		Consumer rQ2 = new Consumer(Q);
		Consumer rQ3 = new Consumer(Q);
		Consumer rQ4 = new Consumer(Q);
		Consumer rQ5 = new Consumer(Q);

//		Thread threadWQ1 = new Thread(wQ1, "thread-wQ1");
//		Thread threadWQ2 = new Thread(wQ2, "thread-wQ2");
//
//		Thread threadRQ1 = new Thread(rQ1, "thread-rQ1");
//		Thread threadRQ2 = new Thread(rQ2, "thread-rQ2");
//		Thread threadRQ3 = new Thread(rQ3, "thread-rQ3");

		wQ1.start();
		wQ2.start();
		wQ3.start();
//		wQ4.start();
//		wQ5.start();

		rQ1.start();
		rQ2.start();
		rQ3.start();
		rQ4.start();
		rQ5.start();
	}
}
/**
 * 队列
 * @author DELL
 *
 */
class Queue {
	List<Message> queue = new ArrayList<Message>();

	/** 队列中message对象的最大值,默认为5 */
	int maxMessageNum = 5;
	//生产产品
	public synchronized void produce(Message message) {
		while (queue.size() == maxMessageNum) {
			System.out.println(Thread.currentThread().getName()
					+ "  队列满!等待中。。。");
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		queue.add(message);
		System.out.println(Thread.currentThread().getName() + "正在生产"
				+ message.getContent() + "。。。  ,当前个数:" + getCount());
		this.notifyAll();

	}
	//消费产品
	public synchronized void consume() {
		while (queue.size() == 0) {
			System.out.println(Thread.currentThread().getName()
					+ "  队列空!等待中。。。");
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Message message = queue.get(0);
		queue.remove(0);
		System.out.println(Thread.currentThread().getName() + "正在消费"
				+ message.getContent() + "。。。 ,当前个数: " + getCount());
		this.notifyAll();

	}

	public synchronized int getCount() {
		return queue.size();
	}
}
/**
 * 生产者
 * @author DELL
 *
 */
class Producer extends Thread {

	private Queue queue;

	Producer(Queue queue) {
		this.queue = queue;
	}

	public void run() {

		while (true) {
			Message message = new Message();
			message.setId(++Message.id);
			message.setContent("food" + Message.id);
			queue.produce(message);
			try {
				sleep(1000);
			} catch (Exception e) {
			}
		}

	}
}

/**
 * 消费者
 * @author qinglong
 *
 */
class Consumer extends Thread {
	private Queue queue;

	Consumer(Queue queue) {
		this.queue = queue;
	}

	public void run() {
		while (true) {
			queue.consume();
			try {
				sleep(1000);
			} catch (Exception e) {
			}

		}
	}
}
/**
 * 消息类
 * @author qinglong
 *
 */
class Message {
	public static int id;
	public String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		Message.id = id;
	}
}[/size]
分享到:
评论

相关推荐

    多线程中的生产者与消费者问题

    有关多线程中生产者与消费者问题,本文档详细介绍了此类问题,并有详细的例子!!

    SafeQueue:C++ 中的线程安全队列实现

    这个类是一个多生产者、多消费者队列。 它同时提供阻塞和非阻塞消费,而生产总是阻塞。 容量是动态调整的。 实现基于std::queue ,使用std::mutex和std::condition_variable实现线程安全。 可以使用右值引用调用...

    不要用强制方法杀掉python线程

    前言:  不要试图用强制方法杀掉一个python...2.在常见的生产消费者的场景下,消费者从任务队列获取任务,但是被干掉后没有把正在做的任务丢回队列中,那么这就造成了数据丢失。 下面是java和python终止线程的方法: jav

    具有可单独重用节点的免等待 spsc 链表队列

    我具有可单独重用节点的免等待单生产者单消费者链表队列。队列操作不会阻塞或分配内存。单个节点单独分配和管理,可以在多个队列上重复使用。例子使用队列在线程之间发送值:use llq:: {Node, Queue};let (mut ...

    Java服务器端开发面试.doc

    NIO(通道,缓冲区,选择器) Java服务器端开发面试题篇2 thread, start(), run() 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口 线程状态,上下文切换,守护线程 消费者和生产者的几种实现方式,...

    C#完整教程

    7.7 线程的同步:生产者和消费者关系 151 习题: 153 第八章 ADO.NET与数据操作 154 8.1 数据库基本概念 154 8.2 设计连接和不连接数据库应用程序的基本步骤: 154 8.3 用ACCESS创建数据库 155 8.4 结构化查询语言SQL...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲、wait和sleep的本质区别是什么,深入分析(面试常见问题).mp4 │ 高并发编程第一阶段28讲、...

    Java开发技术大全 电子版

    8.4.4生产者-消费者问题实例284 8.5本章小结287 第9章运行时类型识别288 9.1RTTI的作用288 9.2用Class类来加载对象289 9.3使用getClass()方法获取类信息290 9.4使用类标记292 9.5使用关键字instanceof判断...

    Python核心编程第二版(ok)

    Python核心编程第二版(ok) 第1部分 Python核心  第1章 欢迎来到Python世界   1.1 什么是Python   1.2 起源   1.3 特点   1.3.1 高级   1.3.2 面向对象   1.3.3 可升级  ...

    Python核心编程第二版

    很不错的python书 第1部分 Python核心  第1章 欢迎来到Python世界   1.1 什么是Python   1.2 起源   1.3 特点   1.3.1 高级   1.3.2 面向对象   1.3.3 可升级   1.3.4 可扩展  ...

Global site tag (gtag.js) - Google Analytics