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

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

2015-01-22 16:14 357 查看
这是马士兵老师的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();

}

}

}

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