生产和消费
import java.io.*;
public class WaitPandC {
static int produceSpeed = 200;
static int consumeSpeed = 200;
public static void main(String[] args) {
if(args.length > 0) {
produceSpeed = Integer.parseInt(args[0]);
}
if(args.length > 1) {
consumeSpeed = Integer.parseInt(args[1]);
}
Monitor monitor = new Monitor();
new Producer (monitor, produceSpeed);
new Producer (monitor, consumeSpeed);
try {
Thread.sleep(1000);
}catch (InterruptedException e) {}
System.exit(0);
}
}
class Monitor {
PrintWriter out = new PrintWriter (System.out, true);
int token;
synchronized int get() {
if( ! valueSet) {
try {
wait();
}catch(InterruptedException e) {}
}
valuesSet = false;
out.println("Gog : " + token);
notify();
return token;
}
synchronized void set(int value) {
if(valueSet) {
try {
wait();
}catch(InterruptedException e) {}
}
valueSet = true;
token = value;
out.println("Set : " + token );
notify();
}
}
class Producer implements Runnable {
Monitor monitor;
int speed;
Producer (Monitor monitor, int speed ) {
this.monitor = monitor;
this.speed = speed;
new Thread(this, "Producer" ).start();
}
public void run() {
int i = 0;
while (true ) {
monitor.set(i++);
try {
Thread.sleep((int) (Math.random()* speed));
}catch(InterruptedException e) {}
}
}
}
class Consumer implements Runnable {
Monitor monitor;
int speed;
Consumer(Monitor monitor, int speed) {
this.monitor = monitor;
this.speed = speed;
new Thread(this, "Consumer").start();
}
public void run() {
while(true) {
monitor.get();
try {
Thread.sleep((int) (Math.random()* speed));
}catch(InterruptedException e) {}
}
}
}
import java.io.*;
public class WaitPandC {
static int produceSpeed = 200;
static int consumeSpeed = 200;
public static void main(String[] args) {
if(args.length > 0) {
produceSpeed = Integer.parseInt(args[0]);
}
if(args.length > 1) {
consumeSpeed = Integer.parseInt(args[1]);
}
Monitor monitor = new Monitor();
new Producer (monitor, produceSpeed);
new Producer (monitor, consumeSpeed);
try {
Thread.sleep(1000);
}catch (InterruptedException e) {}
System.exit(0);
}
}
class Monitor {
PrintWriter out = new PrintWriter (System.out, true);
int token;
boolean valueSet = false;
synchronized int get() {
if( ! valueSet) {
try {
wait();
}catch(InterruptedException e) {}
}
valueSet = false;
out.println("Gog : " + token);
notify();
return token;
}
synchronized void set(int value) {
if(valueSet) {
try {
wait();
}catch(InterruptedException e) {}
}
valueSet = true;
token = value;
out.println("Set : " + token );
notify();
}
}
class Producer implements Runnable {
Monitor monitor;
int speed;
Producer (Monitor monitor, int speed ) {
this.monitor = monitor;
this.speed = speed;
new Thread(this, "Producer" ).start();
}
public void run() {
int i = 0;
while (true ) {
monitor.set(i++);
try {
Thread.sleep((int) (Math.random()* speed));
}catch(InterruptedException e) {}
}
}
}
class Consumer implements Runnable {
Monitor monitor;
int speed;
Consumer(Monitor monitor, int speed) {
this.monitor = monitor;
this.speed = speed;
new Thread(this, "Consumer").start();
}
public void run() {
while(true) {
monitor.get();
try {
Thread.sleep((int) (Math.random()* speed));
}catch(InterruptedException e) {}
}
}
}
分享到:
相关推荐
在计算机科学中,生产者-消费者问题是多线程编程领域中的一个经典问题,它涉及到并发控制和同步。这个问题描述了两个或多个线程(生产者和消费者)如何共享一个有限的资源,通常是一个缓冲区。在VC(Visual C++)...
在本文中,我们将深入探讨如何使用Apache Kafka进行消息生产和消费,以及如何结合Spring MVC框架来实现这一过程。Apache Kafka是一个高性能、分布式的消息中间件,它主要用于构建实时数据管道和流处理应用。Spring ...
"典型的多线程--生产和消费"这个主题,通常指的是生产者-消费者问题,这是一种经典的设计模式,用于解决如何在一个数据结构(如队列)中高效地存储和检索数据,同时避免生产者过于快速地生成数据而消费者无法及时...
《能源生产和消费》这篇资料详尽地探讨了中国在不同年份的能源生产和消费情况,以及各类能源的结构比例。报告主要包括以下几个方面的内容: 一、能源生产和消费概述 报告提供了自1978年至2002年间每年的原煤、原油...
通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化,例如添加异常处理、使用更高级的同步工具(如`...
农村当前生产和消费调研报告揭示了中国农村在农业生产与消费方面的一些关键趋势和挑战。报告指出,农业生产方面,粮食种植情况呈现出多样化,其中粮食作物与经济作物的种植比例有所调整。尽管部分农作物如小麦的种植...
在大数据采集技术中,Java API 是一种常用的工具,用于与 Kafka 进行交互,实现消息的生产和消费。本文将详细讲解如何使用 Java API 创建 Kafka 的生产者和消费者,并阐述相关的大数据采集技术。 首先,我们要了解 ...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
在生产者-消费者模型中,可以设置一个信号量来控制队列的满和空状态,限制生产者的生产速率和消费者的消费速率。 7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、...
(1)创建生产者和消费者线程 在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 ...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
根据给定的文件信息,我们可以总结出以下关于“生产者和消费者模式”的相关知识点: ## 生产者与消费者模式概述 生产者与消费者模式是一种经典的多线程编程模型,广泛应用于计算机科学领域,特别是在并发编程中。...
这个问题的核心在于如何有效地协调生产者和消费者,确保数据的生产和消费是有序且不会出现数据丢失或溢出的情况。 在计算机编程中,生产者消费者模型通常通过使用队列(Queue)数据结构来实现。队列是一种先进先出...
为了解决生产者和消费者之间的问题,Java提供了一系列的同步机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及高级的BlockingQueue接口。 首先,我们要理解生产者消费者模型的基本概念。在该...
- **生产者和消费者类** (`Producer` 和 `Consumer`) 通过调用缓冲区的方法来完成数据的生产和消费过程。 通过这种方式,设计不仅解决了生产者-消费者问题,还为学生提供了一个直观的学习工具,帮助他们更好地理解...
生产者消费者问题是计算机科学中的一种经典问题,用于描述多线程环境下的生产和消费关系。在该问题中,存在一个生产者和一个消费者,生产者将数据放入缓冲区中,而消费者从缓冲区中取出数据。为了解决该问题,需要...
在生产者消费者问题中,适配器模式可能被用来协调生产者和消费者之间的通信,确保数据的正确生产和消费。 在Java中,有几种常见的解决生产者消费者问题的方法: 1. **阻塞队列(BlockingQueue)**:Java并发包`...
这个问题涉及到两个主要角色:生产者和消费者,他们共享一个有限大小的缓冲区。生产者负责生产数据并放入缓冲区,而消费者则从缓冲区取出数据进行消费。在多线程环境下,确保数据的正确生产和消费,避免数据丢失或...
本实验主要研究了两个经典问题:哲学家就餐问题和生产者/消费者问题,通过这两个问题的解决,学生可以深入理解多线程编程、进程同步与互斥的原理以及信号量的应用。 哲学家就餐问题由荷兰计算机科学家埃德加·...