您的位置:首页 > 编程语言 > Java开发

Java多线程同步——生产者消费者问题

2014-05-20 11:03 281 查看
这是马士兵老师的Java视频教程里的一个生产者消费者问题的模型

[java]
view plaincopy

public class ProduceConsumer{
public static void main(String[] args){
SyncStack ss = new SyncStack();
Producer pro = new Producer(ss);
Consumer con = new Consumer(ss);
new Thread(pro).start();
new Thread(con).start();

}
}

class Product{
int id;
public Product(int id){
this.id = id;
}
public String toString(){
return "Product:" + id;
}
}

class SyncStack{
int index = 0;
Product[] arrPro = new Product[6];

public synchronized void push(Product p){
while (index == arrPro.length){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

this.notify();
arrPro[index] = p;
index++;
}

public synchronized Product pop(){
while (index == 0){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

this.notify();
index--;
return arrPro[index];
}

}

class Producer implements Runnable{
SyncStack ss = null;
public Producer(SyncStack ss){ //持有SyncStack的一个引用
this.ss = ss;
}
@Override
public void run() {
for(int i=0; i<20; i++){
Product p = new Product(i);
ss.push(p);
System.out.println("生产了:" + p);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}
}

class Consumer implements Runnable{

SyncStack ss = null;
public Consumer(SyncStack ss){ //持有SyncStack的一个引用
this.ss = ss;
}
@Override
public void run() {
for(int i=0; i<20; i++){
Product p = ss.pop();
System.out.println("消费了:" + p);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: