java多线程实现生产者与消费者---经典问题

前几天老师领着学习了一下单线程和多线程的题目。

这里是操作系统中非常经典的题目,生产者和消费者的题,这里涉及的是仓库,

只有一个人(生产者或消费者)进入,另一个人只有等待。

这里的重点是关于传值的问题。一定要保持一致,不然,对于存和取 的对象,就可能出现多个。

//========================================================================//

仓库类

//========================================================================//

package House;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

public class WareHouse{

ArrayList<Integer>  products = null;

private final int MAXN = 20;

public WareHouse(){

products = new ArrayList<>();

}

public void add(int number){

try {

synchronized (products) {

if(products.size() < MAXN){

System.out.printf("生产者向仓库中存入了一个编号为%d商品\n", number);

products.add(number);

System.out.printf("仓库有中共有: "+ products.size() + "个\n");

products.notify();

}else if(products.size() == MAXN){

System.out.println("仓库已满,请耐心等待消费者来取走商品!!!");

products.wait();

}

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

public void get(int number){

try {

synchronized (products) {

if(products.size() == 0){

System.out.println("仓库已空,请耐心等待商品的添加!!");

products.wait();

}else if(products.size() > 0){

System.out.printf("消费者取出了编号为%d的商品\n", products.get(0));

products.remove(0);

System.out.println("仓库有中共有: "+ products.size() + "个\n");

products.notify();

}

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//===============================================================//

消费者类:

//==========================================================================//

package House;

import java.util.Random;

public class Customer implements Runnable {

Random ran = new Random();

public WareHouse wa;

public int name;

public Customer(WareHouse wa, int name) {

// TODO Auto-generated constructor stub

this.wa = wa;

this.name = name;

}

@Override

public void run() {

// TODO Auto-generated method stub

for(int i = 0; i < 20; i++){

int getnumber = ran.nextInt(600);

wa.get(getnumber);

}

}

}

//=====================================================================================//

生产者类

//=====================================================================================//

package House;

import java.util.Random;

public class Producer implements Runnable {

Random ran = new Random();

public WareHouse wa;

public int name;

public Producer(WareHouse wa, int name) {

// TODO Auto-generated constructor stub

this.wa = wa;

this.name = name;

}

@Override

public void run() {

// TODO Auto-generated method stub

for(int i = 0; i < 20; i++){

int addnumber = ran.nextInt(500);

wa.add(addnumber);

}

}

}

//======================================================================================//

测试类

//========================================================================================//

package House;

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

System.out.println("消费者和生产者的大战开始了----->>>>>>");

WareHouse wa = new WareHouse();

Producer p = new Producer(wa, 1);

Customer C = new Customer(wa, 1);

Thread P1 = new Thread(p);

P1.start();

Thread C1 = new Thread(C);

C1.start();

System.out.println("消费者和生产者的资源抢占结束----->>>>>>");

}

}

时间: 2024-08-05 22:45:03

java多线程实现生产者与消费者---经典问题的相关文章

Java多线程的生产者与消费者模型,线程间的通信

java多线程中的生产者与消费者模式:首先有一个阻塞队列,生产者将生产的东西放到队列里,消费者再从队列中取.当队列中的东西数量达到其容量就发生阻塞. import java.util.Random; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import jav

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

JAVA多线程之生产者消费者

生产者消费者并发编程: 假设仓库有10个仓位,分别有10个生产者和10个消费者,生产者不断生产产品,放入仓库的仓位中,而消费者则不断从仓库中获取产品, 如果仓库已满,则生产者要等待,等消费者消费后,空出仓位后,再继续放入产品. 反之如果仓库已空,则消费者要等待,等待生产者生产出产品后,再继续消费产品. 关于生产者.消费者有四种实现方式 1,wait,nofity方式 2,ReentrantLock锁的await()和signal() 3,阻塞队列的方式 4,Semaphore 信号量方式 下面分

java多线程解决生产者消费者问题

import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class Test { public static void main(String[] args) { GunClip clip = new GunClip(); Producer p = new Producer(clip); customer c = new customer(clip); p.star

java多线程模拟生产者消费者问题,公司面试常常问的题。。。

package com.cn.test3; //java多线程模拟生产者消费者问题 //ProducerConsumer是主类,Producer生产者,Consumer消费者,Product产品 //Storage仓库 //批注:我把输出结果写在程序以下了,你能够看一下,事实上非常easy的,你想象一下产品从生产,到取出的一个生产线,我们定义两个线程,生产者线程,和消费者线程,一个是生产者不停的生产产品并放入数量有限的指定槽内,而消费者从指定槽依次取出产品,现实中的流水车间也相似于此. publ

java_多线程_生产者与消费者(并发协作)

对于多线程程序来说,不管任何编程语言,生产者和消费者模型都是最经典的.就像学习每一门编程语言一样,Hello World!都是最经典的例子. 实际上,准确说应该是“生产者-消费者-仓储”模型,离开了仓储,生产者消费者模型就显得没有说服力了.对于此模型,应该明确一下几点:1.生产者仅仅在仓储未满时候生产,仓满则停止生产.2.消费者仅仅在仓储有产品时候才能消费,仓空则等待.3.当消费者发现仓储没产品可消费时候会通知生产者生产.4.生产者在生产出可消费产品时候,应该通知等待的消费者去消费. packa

Java 多线程 简单实例 (消费者与生成者)的关系

PS::线程这套东西在PHP里完全是不存在的概念,有待进一步的学习: PS::这个实例是根据书本上的知识进行扩展的,理解程度50%左右吧! 1.定义生产消费环境 package second; public class Queue { int value = 0; boolean isEmpty = true; /** * 生产者 * @param v */ public synchronized void put(int v){ if(!isEmpty){//如果存在数据没有被消费 try{

Java中的生产者、消费者问题

Java中的生产者.消费者问题描述: 生产者-消费者(producer-consumer)问题, 也称作有界缓冲区(bounded-buffer)问题, 两个进程共享一个公共的固定大小的缓冲区(仓库). 其中一个是生产者, 用于将产品放入仓库: 另外一个是消费者, 用于从仓库中取出产品消费. 问题出现在当仓库已经满了, 而此时生产者还想向其中放入一个新的产品的情形, 其解决方法是让生产者此时进行等待, 等待消费者从仓库中取走了一个或者多个产品后再去唤醒它. 同样地, 当仓库已经空了, 而消费者还

java多线程之生存者与消费者(Java编程思想)

1.Restaurant package Produce; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; class Meal { private final int orderNum; public Meal(int orderNum) { this.orderNum = orderNum; } @