Java-经典消费者和生产者代码(面试题)

本文介绍了一个基于Java的生产者消费者模式实现,通过Stack作为共享数据结构,利用synchronized关键字和wait/notify方法确保线程间的同步和通信。生产者线程负责往Stack中添加数据,而消费者线程则从中取出数据。

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

生产者代码

import java.util.Stack;

public class Consumer extends Thread{
	private Stack<Integer> stack;
	
	Consumer( Stack<Integer> stack){
		super();
		this.stack = stack;
	}
	
	@Override
	public void run() {
		synchronized (stack) {
			while(true){
				if(!stack.empty()){
					int pop = stack.pop();
					System.out.println("pop"+pop);
					stack.notify();
				}else{//等待				
					try {
						stack.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}		
	}
}

消费者代码

package syncreadandwrite;

import java.util.Stack;

public class Producer extends Thread{
	
	
	private Stack<Integer> stack;
	
	Producer( Stack<Integer> stack){
		super();
		this.stack = stack;
	}
	
	@Override
	public void run() {
		int i=0;
		synchronized (stack) {
			while(i<500){
				if(stack.empty()){//为空,生产数据.
					stack.push(i);
					System.out.println("push"+i);
					i++;
					stack.notify();
				}else{//不为空,等待数据被消费					
					try {
						stack.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}		
	}
}

启动类

package syncreadandwrite;

import java.util.Stack;

public class DemoClass {
	public static void main(String[] args) throws InterruptedException {
		Stack<Integer> stack = new Stack<Integer>();
		Producer p = new Producer(stack);
		Consumer c = new Consumer(stack);
		p.start();
		c.start();
	}
}

结果

push469
pop469
push470
pop470
push471
pop471
push472
pop472
push473
pop473
push474
pop474
push475
pop475
push476
pop476
push477
pop477
push478
pop478
push479
pop479
push480
pop480
push481
pop481
push482
pop482
push483
pop483
push484
pop484
push485
pop485
push486
pop486
push487
pop487
push488
pop488
push489
pop489
push490
pop490
push491
pop491
push492
pop492
push493
pop493
push494
pop494
push495
pop495
push496
pop496
push497
pop497
push498
pop498
push499
pop499

注意:notify()和wait()方法的配合使用,并且使用这两个方法的时候必须获取锁对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值