package thread;
/**
* 生产者消费者模式
* @author 编程只服JAVA
*
*/
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss=new SyncStack();
Producer producer=new Producer(ss);
Consumer consumer=new Consumer(ss);
Thread t1=new Thread(producer);
Thread t2=new Thread(consumer);
t1.start();
t2.start();
}
}
/**
* 窝头类:一个篮子里面的馒头
*/
class WoTou{
int id;//给每一个窝头标记一个id
WoTou(int id){
this.id=id;
}
public String toString(){
return "WoTou:"+id;
}
}
/**
* 利用栈来模拟存放窝头的篮子
*/
class SyncStack{
int index=0;
WoTou[] arrWT=new WoTou[6];//可以装6个窝头
//放窝头:锁住该方法,防止多线程访问,造成前后结果不一致
public synchronized void push(WoTou wt){
if (index==arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();//如果有多个线程 改为notifyAll即可
arrWT[index]=wt;//放入一个窝头
index++;//标记++,以便下次存放窝头
}
//取窝头:锁住该方法,防止多线程访问,造成前后结果不一致
public synchronized WoTou pop(){
if (index==0) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
index--;
return arrWT[index];
}
}
/**
* 生产者:相当一个线程,继承Runnable接口
*/
class Producer implements Runnable{
SyncStack ss=null;
public Producer(SyncStack ss) {
this.ss=ss;
}
public void run() {
for(int i=1;i<=20;i++){
WoTou wt=new WoTou(i);
ss.push(wt);
System.out.println("生产了:"+wt);
try {
Thread.sleep((int)Math.random()*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Consumer implements Runnable{
SyncStack ss=null;
public Consumer(SyncStack ss) {
this.ss=ss;
}
public void run() {
for(int i=1;i<=20;i++){
WoTou wt=ss.pop();
System.out.println("消费了:"+wt);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}描述消费者和生产者模式的代码(有些公司面试的时候会让你直接写一段代码)
最新推荐文章于 2024-04-30 13:01:52 发布
本文通过一个具体的Java程序实现,展示了生产者消费者模式的工作原理。该程序使用了同步栈来模拟生产者(制作窝头)与消费者(消费窝头)之间的交互过程,有效地解决了资源竞争的问题,并展示了如何在多线程环境中正确地使用wait()和notify()方法。
&spm=1001.2101.3001.5002&articleId=52062255&d=1&t=3&u=f95754f781144d749c3e01e3ce74704a)
7838

被折叠的 条评论
为什么被折叠?



