首页 > 代码库 > 多线程消费者和制造者的金典案例!!

多线程消费者和制造者的金典案例!!

public class Clerk {

private int product=0;//产品默认0;

//生产者生成出来的产品交给店员

public synchronized void addProduct(){

if(this.product>=20){

try {

wait();//产品已满,请稍等在生产

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}else{

product++;

System.out.println("生产者生产地"+product+"个产品。");

notifyAll(); //通知等待区的消费者今天取产品了

}

}

//消费者从店员处取产品

public synchronized void getProduct(){

if(this.product<=0){

try {

wait();//产品没有货了,请稍等再取

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}else{

System.out.println("消费者取走了第"+product+"个产品");

product--;

notifyAll();//通知等待区的生成者可以生产 产品

}

}

}

//消费者线程要执行的任务

public class Consumer implements Runnable {

private Clerk cl;

  public Consumer(Clerk cl) {

this.cl=cl;

}

  

  

public void run() {

System.out.println("消费者开始取走产品!");

while(true){

try {

Thread.sleep((int)(Math.random()*10)*100);

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

cl.getProduct();//取走产品

}

}


}

//生产者线程要执行的任务

public class Producer implements Runnable {

private Clerk cl;

public Producer(Clerk cl){

this.cl=cl;

}


public void run() {

System.out.println("生产者开始生产产品!");

while(true){

try {

Thread.sleep((int)(Math.random()*10)*100);

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

cl.addProduct();//生产产品

}

}

}

public class Main {


public static void main(String[] args) {

// TODO 自动生成的方法存根

Clerk cl=new Clerk();

Thread prt=new Thread(new Producer(cl));//生产者线程

Thread cot=new Thread(new Consumer(cl));//消费者线程

prt.start();

cot.start();

}


}


本文出自 “12156507” 博客,请务必保留此出处http://12166507.blog.51cto.com/12156507/1875372

多线程消费者和制造者的金典案例!!