`
dreamoftch
  • 浏览: 497967 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

马士兵生产者消费者

阅读更多
public class ProducerConsumer {
	public static void main(String[] args) {
		SyncStack ss = new SyncStack();
		Producer p = new Producer(ss);
		Consumer c = new Consumer(ss);
		new Thread(p).start();
		new Thread(c).start();
	}
}

class WoTou {
	int id;

	WoTou(int id) {
		this.id = id;
	}

	public String toString() {
		return "WoTou : " + id;
	}
}

class SyncStack {
	int index = 0;
	WoTou[] arrWT = new WoTou[6];

	public synchronized void push(WoTou wt) {
		while (index == arrWT.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		arrWT[index] = wt;
		System.out.println("set: " + arrWT[index]);
		index++;
	}

	public synchronized WoTou pop() {
		while (index == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		System.out.println("get :" + arrWT[index]);
		return arrWT[index];
	}
}

class Producer implements Runnable {
	SyncStack ss = null;

	Producer(SyncStack ss) {
		this.ss = ss;
	}

	public void run() {
		for (int i = 0; i < 20; i++) {
			WoTou wt = new WoTou(i);
			ss.push(wt);
			try {
				Thread.sleep((int) (Math.random() * 200));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable {
	SyncStack ss = null;

	Consumer(SyncStack ss) {
		this.ss = ss;
	}

	public void run() {
		for (int i = 0; i < 20; i++) {
			WoTou wt = ss.pop();
			try {
				Thread.sleep((int) (Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

 

下面是自己的demo:

 

import org.apache.log4j.Logger;


public class Consumer implements Runnable{
	private Container container;
	Logger log = Logger.getLogger(Consumer.class);
	
	public Consumer(Container container){
		this.container = container;
	}
	@Override
	public void run() {
		for(int i=0;i<10;i++){
			try {
				Thread.sleep((int) (Math.random() * 1000));
				container.get();
				//log.info("消费了:"+container.get());
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 

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

import org.apache.log4j.Logger;

public class Container {
	private List<Food> container;
	Logger log = Logger.getLogger(Container.class);

	public Container(List<Food> container){
		this.container = container;
	}
	
	public synchronized Food get() throws Exception{
		if(container == null){
			container = new ArrayList<Food>();
		}
		while(container.isEmpty()){
			this.wait();
		}
		Food food = container.remove(container.size()-1);
		log.info("get food:"+food+",container:"+container);
		this.notifyAll();
		return food;
	}
	
	public synchronized void set(Food food) throws Exception{
		if(container == null){
			container = new ArrayList<Food>();
		}
		while(container.size() >= 10){
			this.wait();
		}
		log.info("set food: "+food+",container:"+container);
		container.add(food);
		this.notifyAll();
	}
}

 

public class Food {

	private int id;

	public Food(int id){
		this.id = id;
	}
	
	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return "Food [id=" + id + "]";
	}
	
}

 

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ProducerConsumerTest {

	public static void main(String[] args) {
		List<Food> list = new ArrayList<Food>();
		Container container = new Container(list);
		Producer p = new Producer(container);
		Consumer c = new Consumer(container);
		//new Thread(p).start();
		//new Thread(p2).start();
		//new Thread(c).start();
		ExecutorService pool = Executors.newFixedThreadPool(2);
		pool.execute(p);
		pool.execute(c);
	}
	
}

 

分享到:
评论

相关推荐

    jvm java虚拟机 调优 马士兵 笔记

    jvm java虚拟机 调优 马士兵 笔记 让你对java虚拟机调优有初步的认识

    马士兵老师spring框架学习笔记

    马士兵老师是知名的Java教育专家,他的Spring框架学习笔记深入浅出,对于初学者和进阶者来说都是一份宝贵的资源。这份笔记涵盖了Spring的核心概念、配置、AOP(面向切面编程)、DI(依赖注入)等关键知识点。 1. **...

    马士兵oracle笔记

    马士兵oracle笔记,浅显易懂。

    马士兵JAVA笔记(全).docx

    马士兵JAVA笔记(全) 本资源是马士兵的JAVA笔记,涵盖了JAVA语言的基础知识,包括标识符、常量、变量、数据类型、运算符、控制流语句等。 标识符是JAVA中的一种符号,用于命名变量、方法、类等。标识符由字母、...

    马士兵jvm调优笔记.docx

    ### 马士兵JVM调优笔记知识点梳理 #### 一、Java内存结构 Java程序运行时,其内存被划分为几个不同的区域,包括堆内存(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)以及...

    马士兵课程源码11111111111111111111

    马士兵课程源码11111111111111111111

    JAVA就业班笔记【马士兵说】.nyf

    JAVA就业班笔记【马士兵说】.nyf

    Shopping. java 马士兵

    《Java网上商城系统——马士兵教程深度解析》 在当今数字化时代,网上商城已经成为商业活动中不可或缺的一部分。本项目,名为“Shopping”,是一个基于Java技术构建的可运行的购物系统,由知名IT教育专家马士兵倾力...

    马士兵 html css js源码

    马士兵是一位知名的IT教育专家,他的课程深入浅出,适合初学者和有一定基础的学习者。这个“马士兵 html css js源码”压缩包很可能包含了他在教学过程中用到的各种实例和特效代码,是学习和实践这些技术的宝贵资源。...

    马士兵Struts2笔记2013

    以下是关于"马士兵Struts2笔记2013"中的关键知识点详解: 1. **建立Struts2工程** 创建一个Struts2工程通常涉及在集成开发环境中(如MyEclipse)创建一个新的Web项目,然后将必要的Struts2库添加到项目的`lib`目录...

    马士兵 J2SE代码+PPT教材

    【马士兵 J2SE代码+PPT教材】是针对Java初学者和爱好者提供的一套学习资源,由知名IT教育专家马士兵编著。这套教材涵盖了Java Standard Edition (J2SE) 的核心概念和技术,旨在帮助读者掌握Java编程的基础知识和实践...

    马士兵_操作手册

    马士兵 struts2 操作手册

    马士兵老师HashMap学习笔记

    《马士兵老师HashMap学习笔记详解》 HashMap是Java编程语言中常用的一种数据结构,它提供了键值对(key-value pair)的存储功能,是基于哈希表实现的。马士兵老师的HashMap学习笔记深入剖析了这一核心组件的工作...

    马士兵Hibernate文档

    根据提供的文件信息,“马士兵Hibernate文档”是一份与马士兵Hibernate视频教程相匹配的文档资料。这份文档旨在为学习者提供全面、详细的Hibernate框架的学习资料,帮助他们更好地理解和掌握Hibernate的相关概念和...

    Spring学习笔记(马士兵spring视频笔记).doc

    Spring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).docSpring学习笔记(马士兵spring视频笔记).doc

    马士兵多线程训练营笔记

    5. **线程通信**:wait()、notify()、notifyAll()方法的使用,以及在生产者消费者模型、哲学家就餐问题等经典示例中的应用。 6. **线程池**:ExecutorService、ThreadPoolExecutor和Future接口的理解,线程池的配置...

    马士兵j2se源码和ppt

    总的来说,这个资源包为Java初学者提供了一个全面的学习路径,通过马士兵的专业讲解和源码实例,能够帮助学习者扎实地掌握J2SE,为后续的Java EE和Android开发打下坚实的基础。同时,对于有一定经验的开发者,这些...

    马士兵 mybatis学习笔记

    马士兵老师的MyBatis学习笔记主要涵盖了以下几个核心知识点: 1. **MyBatis安装与环境搭建**:首先,你需要配置Java开发环境,并了解Maven或Gradle构建工具,因为MyBatis通常与这些工具结合使用来管理依赖。然后,...

    马士兵NewShopping代码

    是自己根据马士兵的NewShopping模仿着一步步做的,对项目的界面进行了美化,更加漂亮美观,并对视频中项目一些细节不足的地方进行了一些修正,并添加了部分功能进行完善,但是对于视频中报表和文件上传的功能我并...

    马士兵百万级并发IM即时消息系统

    《马士兵百万级并发IM即时消息系统》是针对大规模用户在线聊天场景设计的高效、稳定、可扩展的即时通讯解决方案。该系统的核心是利用Go语言的高性能特性,结合现代Web开发框架Gin来构建,旨在处理百万级别的并发连接...

Global site tag (gtag.js) - Google Analytics