Thread(生产者和消费者)

package com.gdut.lang.thread;

public class ProducerAndConsumer {

	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 {
	private int id;

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

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

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

	public synchronized void push(WoTou wt) {
		if ( index == arrWT.length ) { //窝头数组满了
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		arrWT[index] = wt;
		index++;
		this.notify();
	}

	public synchronized WoTou pop() {

		if ( index == 0 ) { //数组里面没窝头了
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		index--;
		this.notify();
		return arrWT[index];

	}
}

class Producer implements Runnable {
	SyncStack ss = null;
	public Producer(SyncStack ss) {
		this.ss = ss;
	}

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

}

class Consumer implements Runnable {
	SyncStack ss = null;
	public Consumer(SyncStack ss) {
		this.ss = ss;
	}

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

}

  

时间: 2024-08-10 02:10:49

Thread(生产者和消费者)的相关文章

多线程操作实例——生产者与消费者

面对多线程学习生产者与消费者是最基本的实例 对于java后端开发的人员必须要掌握,还有考研考试计算机操作系统的同鞋. 下面是三个实例对于生产者与消费者的的例子,层层递进,逐步解决问题. 问题:生产者——设置信息名字name,和内容content 消费者——负责取出设置的信息. 一.基本实现 由于线程的不确定性可能出现以下问题: (1)消费者取出的信息不匹配,即不是由同一个生产者设置的信息 (2)生产者生产了多个信息,消费者才开始取出信息,或消费者取出的重复的信息. 上面的问题下面会逐一解决,下面

同步函数 生产者和消费者模式 加强版(多人生产和多人消费)

曾经搞了半天, 生产者和消费者模式  加强版(多人生产 多人消费 ).. 以前的代码格式就不再吐槽了(以后努力改进) //输出结果是一个无限循环 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 多个生产者&多个消费者模式 * 多个生产者不断生产,多个消费者不停的消费

java多线程(同步与死锁问题,生产者与消费者问题)

首先我们来看同步与死锁问题: 所谓死锁,就是A拥有banana,B拥有apple. A对B说:你把apple给我,我就把banana给你. B对A说:你把banana给我,我就把apple给你. 但是A和B都在等待对方的答复,那么这样最终的结果就是A得不到apple,B也得不到banana.这种死循环就是死锁. 于是我们可以模拟上面的描述,写出以下代码: 类A代表A这个人, public class A { public void say(){ System.out.println("A sai

生产者与消费者问题

***********************************************声明****************************************************** 原创作品,出自 "晓风残月xj" 博客,欢迎转载,转载时请务必注明出处(http://blog.csdn.net/xiaofengcanyuexj). 由于各种原因,可能存在诸多不足,欢迎斧正! *******************************************

java的多生产者多消费者例子

import java.util.concurrent.locks.*; public class Test9 { public static void main(String[] args) { // TODO 自动生成的方法存根 Resource r=new Resource(); Producer p=new Producer(r); Consumer c=new Consumer(r); Thread t0=new Thread(p); Thread t1=new Thread(p);

使用JUC并发工具包的Lock和Condition,实现生产者和消费者问题中的有界缓存

JDK5.0之前,用java实现生产者和消费者的唯一方式就是使用synchronized内置锁和wait/notify条件通知机制.JDK5.0之后提供了显示锁Lock和条件队列Condition,与内置锁和内置条件队列相对应,但是显示的锁和条件队列,功能更强大,更灵活.此外JDK5.0之后还提供了大量很有用的并发工具类,如BlockingQueue等,基于这些数据结构,能够方便.快速.高效的构建自己应用需要的效果.这里我们简单使用下显示锁和条件队列,来模拟有界缓存的实现,功能类似于JDK内置的

java 22 - 16 多线程之生产者和消费者的问题

生产者和消费者问题的描述图 通过上图,我们可以发现: 生产者和消费者使用的都是同一个资源(肉包子) 所以,当使用线程的时候,这两类的锁也是同一把锁(为了避免出现线程安全问题) 例子:学生信息的录入和获取 * 资源类:Student * 设置学生数据:SetThread(生产者) * 获取学生数据:GetThread(消费者) * 测试类:StudentDemo * 资源类:Student 1 public class Student { 2 3 String name; 4 int age; 5

多线程生产者、消费者模式中,如何停止消费者?多生产者情况下对“毒丸”策略的应用。

生产者.消费者模式是多线程中的经典问题.通过中间的缓冲队列,使得生产者和消费者的速度可以相互调节. 对于比较常见的单生产者.多消费者的情况,主要有以下两种策略: 通过volatile boolean producerDone =false 来标示是否完成.生产者结束后标示为true, 消费者轮询这个变量来决定自己是否退出. 这种方式对producerDone产生比较大的争用,实现起来也有诸多问题需要考虑. 比较经典的"毒丸"策略,生产者结束后,把一个特别的对象:"毒丸&quo

生产者与消费者模式

1 准确说应该是生产者(setter)-消费者(getter)-仓储模型,离开了仓储,生产者消费者模型就显得没有说服 2 力了. 3 >实现代码: 4 5 //1. 实体设计:同步栈仓储,共享数据域 6 class SyncStack{ 7 8 //同步栈仓储中的数据产品,默认为10个大小 9 private String[] products=new String[10]; 10 //数据产品数据的下标索引,初始化为0 11 private int index=0; 12 13 //sette