`
veivei5521
  • 浏览: 6639 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

线程+栈 简单实现 生产者消费者关系

阅读更多
//生产
package test_produce;

public class Produce implements Runnable{
	Stack_used su;
	
	public Produce(){}
	public Produce(Stack_used su){
		this.su = su;
	}
	
//这里以生产100次为例
	public void run(){
		for(int i = 0; i < 100; i++){
			su.pushOne(i);
		}
	}

}



//消费

package test_produce;

public class Consume implements Runnable{
	Stack_used su;
	
	public Consume(){}
	public Consume(Stack_used su){
		this.su = su;
	}
	
	public void run(){
		for(int i = 0; i < 100; i++){
			su.popOne();
		}
	}
} 


//栈实现
package test_produce;

import java.util.Stack;

public class Stack_used {
	public static final int SIZE = 5;//定义生产上限
	Stack<Integer> stack ;
	
	public Stack_used(){
		super();
	}
	public Stack_used(Stack<Integer> stack){
		this();
		this.stack = stack;
	}
	
	public void pushOne(int n){
		synchronized(this){
			if(stack.size() >= Stack_used.SIZE){
				try {
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
	
			System.out.println("Produce:"+stack.push(n));
			
			//小睡一会,使结果明显一点
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			notifyAll();
		}
	}

	public void popOne(){
		synchronized(this){
			if(stack.isEmpty()){
				try {
					wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			
			System.out.println("--Consume:"+stack.pop());
			
			//小睡一会,使结果明显一点
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
			notifyAll();
		}
	}
}



//测试

package test_produce;

import java.util.Stack;

public class Test {
	public static void main(String[] args) {
		Stack_used su = new Stack_used(new Stack<Integer>());
		Produce produce = new Produce(su);
		Consume consume = new Consume(su);
		
		new Thread(produce).start();
		new Thread(consume).start();

	}

}
/*
//部分结果...
 
Produce:0
Produce:1
Produce:2
Produce:3
Produce:4
--Consume:4
Produce:5
--Consume:5
--Consume:3
--Consume:2
--Consume:1
--Consume:0
Produce:6
Produce:7
Produce:8
Produce:9
--Consume:9
--Consume:8
--Consume:7
Produce:10
Produce:11
Produce:12
Produce:13
--Consume:13
--Consume:12
--Consume:11
--Consume:10
Produce:14
Produce:15
Produce:16
Produce:17
--Consume:17
--Consume:16
--Consume:15
--Consume:14
--Consume:6
Produce:18
Produce:19
--Consume:19
--Consume:18
...
 */ 
 
分享到:
评论

相关推荐

    Java多线程实现生产者消费者

    编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    Java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) ...

    java多线程笔记

    Java线程:概念与原理 2 一、操作系统中线程和进程的概念 2 二、Java中的线程 3 三、Java中关于线程的名词解释...Java线程:并发协作-生产者消费者模型 52 Java线程:并发协作-死锁 55 Java线程:线程之间的数据传递 58

    Java 线程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    设计模式 保护性暂停 解耦等待 生产者消费者.docx

    因为线程各类数据都在栈中,而对象数据都在堆中所以可以实现两个线程在同一个对象代码块里面操作(临界区)。一个设置,一个拿取出。在setThread还未将数据写入时,getThread进行wait操作直到setThread进行notifuall...

    Java并发编程(学习笔记).xmind

    生产者-消费者模式 中断的处理策略 传递InterruptedException 恢复中断,让更高层的代码处理 PriorityQueue(非并发) ConcurrentSkipListMap 替代同步的SortedMap ...

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

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

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

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

    Java并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    Java 并发编程实战

    5.3 阻塞队列和生产者-消费者模式 5.3.1 示例:桌面搜索 5.3.2 串行线程封闭 5.3.3 双端队列与工作密取 5.4 阻塞方法与中断方法 5.5 同步工具类 5.5.1 闭锁 5.5.2 FutureTask 5.5.3 信号量 5.5.4 栅栏 5.6...

    Java服务器端开发面试.doc

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

    javalruleetcode-MyLeetCode:我的LeetCode+JZoffer算法题学习

    java lru leetcode 面试题刷题,java基础知识 该仓库作为个人刷题的题目记录仓库,包含剑指Offer上的全部面试题...还包括一些java基础知识,多线程,阻塞队列实现的生产者消费者模式,缓存 单例模式,动态代理模式等。

    javaSE代码实例

    16.4.5 “生产者-消费者”案例的实际运行 365 16.4.6 notify方法的使用 366 16.4.7 同步的语句块 367 16.4.8 线程的死锁 369 16.4.9 防止错误的使用wait、notify、notifyAll方法 371 16.5 获取当前正在...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    E:. │ 1.txt │ ├─千锋Python教程:第01章 第一个Python程序与数据存储及数据类型(9集) │ │ .DS_Store │ │ │ ├─code │ │ 1、数据存储.txt ...继承的实现&继承体系&栈和队列&python2;.2之前的...

    JAVA 范例大全 光盘 资源

    实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 模仿QQ空间的电子相册 409 实例140 会动的七彩文字 413 实例141 ...

Global site tag (gtag.js) - Google Analytics