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

java多线程模拟生产者消费者问题

2013-04-24 22:42 591 查看
public class ProducerConsumer {

public static void main(String[] args) {

Storage s = new Storage();

Producer p = new Producer(s);

Consumer c = new Consumer(s);

Thread tp = new Thread(p);

Thread tc = new Thread(c);

tp.start();

tc.start();

}

}

class Consumer implements Runnable {//消费者

Storage s = null;

public Consumer(Storage s){

this.s = s;

}

public void run() {

for(int i=0; i<20; i++){

Product p = s.pop();//取出产品

try {

Thread.sleep((int)(Math.random()*1500));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

class Producer implements Runnable {//生产者

Storage s = null;

public Producer(Storage s){

this.s = s;

}

public void run() {

for(int i=0; i<20; i++){

Product p = new Product(i);

s.push(p);
//放入产品

try {

Thread.sleep((int)(Math.random()*1500));

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

class Product {

int id;

public Product(int id){

this.id = id;

}

public String toString(){//重写toString方法

return "产品:"+this.id;

}

}

class Storage {

int index = 0;

Product[] products = new Product[5];

public synchronized void push(Product p){//放入

while(index==this.products.length){

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

this.products[index] = p;

System.out.println("生产者放入"+index+"位置:" + p);

index++;

this.notifyAll();

}

public synchronized Product pop(){//取出

while(this.index==0){

try {

this.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

index--;

this.notifyAll();

System.out.println("消费者从"+ index+ "位置取出:" + this.products[index]);

return this.products[index];

}

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