Food类:食物 ,代表缓存里面的产品
FoodCache:缓存,用栈实现
Producer:生产者进程
Consumer:消费者进程
Demo:例子
/*
* @(#)Food.java, 2012-10-18 上午09:49:26
*
* All rights reserved.
*/
package com.wang.thread;
/**
* 在这里加入功能说明
*
* @author wangxiaowei
* @version $Revision: 1.4 $, 2012-10-18$
*/
public class Food
{
private int id;
public Food(int id)
{
this.id = id;
}
/**
* @return Returns the id.
*/
public int getId()
{
return id;
}
/**
* @param id The id to set.
*/
public void setId(int id)
{
this.id = id;
}
}
/*
* @(#)FoodCache.java, 2012-10-18 上午09:51:24
*
* All rights reserved.
*/
package com.wang.thread;
/**
* 在这里加入功能说明
*
* @author wangxiaowei
* @version $Revision: 1.4 $, 2012-10-18$/* * @(#)Consumer.java, 2012-10-18 上午10:13:53
*
* All rights reserved.
*/
package com.wang.thread;
/**
* 在这里加入功能说明
*
* @author wangxiaowei
* @version $Revision: 1.4 $, 2012-10-18$
*/
public class Consumer extends Thread
{
private FoodCache foodCache;
public Consumer(FoodCache foodCache)
{
this.foodCache = foodCache;
}
public void run()
{
for(int i=0; i<10; i++)
{
synchronized(foodCache)
{
Food food = foodCache.pop();
System.out.println("消费了:"+food.getId()+"号食物!");
}
}
}
}
/*
* @(#)Producer.java, 2012-10-18 上午10:08:42
*
* All rights reserved.
*/
package com.wang.thread;
/**
* 在这里加入功能说明
*
* @author wangxiaowei
* @version $Revision: 1.4 $, 2012-10-18$
*/
public class Producer extends Thread
{
private FoodCache foodCache;
public Producer(FoodCache foodCache)
{
this.foodCache = foodCache;
}
public void run()
{
for(int i=0; i<10; i++)
{
synchronized(foodCache)
{
Food food = new Food(i);
System.out.println("生产了第"+food.getId()+"号食物");
foodCache.push(food);
}
}
}
}
/*
* @(#)Demo.java, 2012-10-18 上午10:15:53
*
* All rights reserved.
*/
package com.wang.thread;
/**
* 在这里加入功能说明
*
* @author wangxiaowei
* @version $Revision: 1.4 $, 2012-10-18$
*/
public class Demo
{
/**
*
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
FoodCache foodCache = new FoodCache();
Producer producer = new Producer(foodCache);
Consumer consumer = new Consumer(foodCache);
producer.start();
consumer.start();
}
}
*/
public class FoodCache
{
private int length = 10 ;
private Food[] cache = new Food[length];
private int top = -1;
public FoodCache()
{
}
public Food pop()
{
while(top==-1)
{
try
{
System.out.println("缓存没有食物了,我的心在等待 .........");
this.wait();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
return cache[top--];
}
public void push(Food food)
{
while(top==length-1)
{
try
{
this.wait();
System.out.println("缓存里面的食物已经满了,快来吃我吧!");
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
cache[++top] = food;
}
}
分享到:
相关推荐
本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...
生产者-消费者问题是并发编程中的经典问题,它模拟了生产者进程(如计算进程)生成信息和消费者进程(如输出打印进程)使用信息的场景。由于两者执行速度的不确定性,需要引入缓冲区作为中间存储,以避免生产者过快...
【标题与描述】所涉及的知识点是“生产者-消费者问题”,这是一个经典的多线程同步问题,常见于操作系统课程设计中。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。多线程同步是解决这类...
2. `BlockingQueue`:队列实现的线程通信,如`ArrayBlockingQueue`、`LinkedBlockingQueue`,适合生产者消费者模式。 五、线程池 1. `ExecutorService`:Java 5引入的线程池接口,通过`Executors`工厂类创建不同...
本篇文章将深入探讨如何使用Java实现“生产者-消费者”问题的进程同步。 生产者-消费者问题是多线程设计模式中的一个经典案例,它模拟了两个角色——生产者和消费者,共享一个有限的缓冲区。生产者负责生成产品并放...
在多线程编程中,生产者-消费者问题是一个经典的同步问题。它描述了一组生产数据的线程(生产者)和一组消费这些数据的线程(消费者)。为了确保线程间的正确同步,通常会使用信号量来控制资源的访问。本示例虽然...
在计算机科学领域,生产者与消费者模型是一种经典的同步机制,被广泛应用于多线程编程、操作系统设计以及分布式系统架构中。该模型主要解决的是多个进程或线程之间如何有效地共享资源的问题。在本次实验报告中,我们...
【操作系统中的Java多线程实验】 Java多线程是操作系统中的一个重要概念,它允许程序同时执行多个任务。在这个实验中,我们将重点学习如何利用Java进行多线程编程,特别是解决生产者消费者问题。 **一、实验目的**...
该问题主要描述了一组生产者进程不断生成数据并将其放置在一个共享缓冲区中,而一组消费者进程则从这个缓冲区中取出数据进行处理的过程。为了确保系统的稳定运行,需要设计合适的机制来同步生产者和消费者的动作,...
### Java多线程文章系列知识点概述 #### 一、Java多线程编程详解 ##### 1. 理解多线程 - **定义**: 多线程是一种机制,允许程序中并行执行多个指令流,每个指令流称为一个线程。 - **特点**: - 线程拥有独立的...
由于多线程共享进程资源,线程同步是Java多线程编程中的一个重要概念。当多个线程访问同一个资源时,可能会出现数据不一致的情况。为了解决这一问题,Java提供了多种同步机制,包括synchronized关键字、...
操作系统中的“生产者消费者问题”是一个经典的多线程同步问题,源自计算机科学的并发控制领域。这个问题由Dijkstra在1965年提出,旨在模拟一个系统,其中多个生产者生成数据,然后由多个消费者消费这些数据。在这个...
操作系统中的“生产者-消费者问题”是一个经典的多线程同步问题,主要涉及到进程间的通信与资源的共享。在这个问题中,生产者线程负责生成数据(产品),而消费者线程则负责消费这些数据。Java作为一种多线程编程...
- **生产者消费者模型**:使用阻塞队列(如`BlockingQueue`)实现线程间的通信和协作。 - **死锁**:多个线程相互等待对方释放资源造成无法继续执行的状态,应避免死锁的发生。 7. **并发新特性**: - **线程池*...
实验要求学生使用Windows XP或2000操作系统,使用如C、VB、Java等编程语言,通过多进程或多线程方式实现生产者-消费者问题,同时要求程序界面美观,程序运行正常,并且能体现进程(线程)的同步互斥关系。...
生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据交换。这个问题源于操作系统的并发控制理论,是研究进程间通信和同步的重要实例。在操作系统课程中,通常会通过...
### 图灵图书:图解JAVA多线程设计模式 #### 关键知识点概览 - **Java多线程基础** - 线程的概念与创建方式 - 线程的状态及其转换 - 线程生命周期 - **Java并发编程** - 同步机制(synchronized关键字) - ...
操作系统编程实践课程设计报告中,主要探讨了Java多线程在进程和线程同步问题上的应用。本报告分为几个部分,详细阐述了线程的创建与启动、线程的简单同步、生产者-消费者问题的实现以及对整体项目的总结。 首先,...
- **生产者-消费者模式**:通过队列结构来实现线程间的解耦。 - **同步机制**: - **同步代码块**:通过synchronized关键字实现对临界区的互斥访问。 - **ReentrantLock类**:提供比内置锁更灵活的锁定机制。 - *...
生产者与消费者问题是操作系统中经典的进程同步问题,它模拟了多线程环境下资源的共享与协作。在这个案例中,我们以会计与出纳的工作过程为例,来解释这个问题的解决策略。 首先,会计与出纳分别代表了生产者和消费...