package com.ixhong.base.thread.base;
public class ProducerConsumer {
public static void main(String[] args) {
SyncStack ss = new SyncStack();
new Thread(new Producer(ss, "p1")).start();
new Thread(new Consumer(ss, "c1")).start();
new Thread(new Producer(ss, "p2")).start();
new Thread(new Consumer(ss, "c2")).start();
}
}
class WoTou {
private int id;
public WoTou(int id) {
this.id = id;
}
public int getId() {
return id;
}
public String toString() {
return "WT" + getId();
}
}
class SyncStack {
private int index = 0;
private WoTou[] arrWT = new WoTou[6];
public synchronized void push(WoTou wt) {
while (index == arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {}
}
this.notifyAll();
arrWT[index++] = wt;
}
public synchronized WoTou pop() {
while (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {}
}
this.notifyAll();
return arrWT[--index];
}
}
class Producer implements Runnable {
private SyncStack ss = null;
private String name;
public Producer(SyncStack ss, String name) {
this.ss = ss;
this.name = name;
}
public String getName() {
return name;
}
public void run() {
for (int i = 0; i < 60; i++) {
WoTou wt = new WoTou(i);
ss.push(wt);
System.out.println(getName() + "生产" + wt);
try {
Thread.sleep((long) (Math.random() * 100));
} catch (InterruptedException e) {}
}
}
}
class Consumer implements Runnable {
private SyncStack ss = null;
private String name;
public Consumer(SyncStack ss, String name) {
this.ss = ss;
this.name = name;
}
public String getName() {
return name;
}
public void run() {
for (int i = 0; i < 60; i++) {
WoTou wt = ss.pop();
System.out.println(getName() + "消费" + wt);
try {
Thread.sleep((long) (Math.random() * 400));
} catch (InterruptedException e) {}
}
}
}
生产者消费者实例
原创京东技术 ©著作权
文章标签 synchronized i++ 文章分类 运维
©著作权归作者所有:来自51CTO博客作者京东技术的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
chan实现生产者消费者模型
一个简单的例子让你更好的理解golang chan的使用
斐波拉契数列 斐波那契数列 Group -
python 队列生产者消费者爬虫
Python队列生产消费者爬虫示例。
HTTP bash 爬虫 Python