java生产者消费者经典问题

本文详细介绍了生产者消费者模式的概念及其实现方式。通过具体的Java代码示例,演示了如何利用synchronized关键字来确保线程安全,并实现了生产者与消费者的协调工作。此模式常用于解决多线程环境下数据共享的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


/*@src http://eric-619.iteye.com/blog/693681
* 生产者消费者问题其含义就是先生产出了产品,才能拉出去让消费者购买
* 一、重点:
* 1、多个线程数据共享区域化思想!---源于多线程的近亲思想!!(类似于静态变量的改变)
* (如栈内存和对内存,还有当做栈内存和堆内存,如数组和基本数据类型,只要是访问的同一个。)
* 2、生产者消费者
*
* 二、synchronized加锁:
*
*/


public class ProCon{ //主方法

public static void main(String[] args){
SyncStack stack = new SyncStack();
Consumer p = new Consumer(stack);
Producer c = new Producer(stack);


new Thread(p).start();
new Thread(c).start();
}
}

class Producer implements Runnable{ //生产者
private SyncStack stack;

public Producer(SyncStack stack){
this.stack = stack;
}

public void run(){
for (int i = 0; i < stack.pro().length; i++){
String product = "产品"+i;
stack.push(product);
System.out.println("生产了: "+product);
try{
Thread.sleep(200);
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}

class Consumer implements Runnable{ //消费者
private SyncStack stack;

public Consumer(SyncStack stack) {
this.stack = stack;
}

public void run(){
for(int i = 0; i < stack.pro().length; i++){
String product = stack.pop();
System.out.println("消费了: "+product);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}

class SyncStack{ // 此类是(本质上:共同访问的)共享数据区域
private String[] str = new String[10];
private int index;

public synchronized void push(String sst){ //供生产者调用
if(index == sst.length()){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
this.notify(); //唤醒在此对象监视器上等待的单个线程
str[index] = sst;
index++;
}

public synchronized String pop(){ //供消费者调用
if(index == 0){
try{
wait();
}catch (InterruptedException e){
e.printStackTrace();
}
}
notify();
index--;
String product = str[index];
return product;
}

public String[] pro(){ //就是定义一个返回值为数组的方法,返回的是一个String[]引用
return str; //这是一个String[]引用
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值