生产者与消费者案例
(多线程的开发中最经典的操作案例,生产者不断生产产品,消费者不断取走产品)
public class Demo {
/*
* 生产者、消费者问题
*
* 生产者将产品交给店员,而消费者从店员取走产品,店员一次只能持有固定数量的产品,
* 如果生产者生产了过多的产品,店员会叫生产者等一下,如果店中有空位放产品了在通知生产者继续生产;
* 如果店中没有了产品,店员会告诉消费者等一下,如果店中有产品了再通知消费者取走产品。
*
*/
}
//店员
public class Clerk {
private int product=0;//产品默认为0
//生产者生成出来的产品交给店员
public synchronized void addProduct(){
if(this.product>=20){
try {
wait();//产品已满,请稍等在生产
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
product++;
System.out.println("生产者生产地"+product+"个产品。");
notifyAll();//通知等待区的消费者今天取产品了
}
}
//消费者从店员处取产品
public synchronized void getProduct(){
if(this.product<=0){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
System.out.println("消费者取走了第"+product+"个产品");
product--;
notifyAll();//通知等待区的生产者可以生产产品
}
}
}
//生产者线程要执行的任务
public class Producer implements Runnable {
private Clerk cl;
public Producer(Clerk cl) {
this.cl = cl;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("生产者开始生产产品!");
while(true){
try {
Thread.sleep((int)(Math.random()*10)*100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cl.addProduct();
}
}
}
//消费者线程要执行的任务
public class Consumer implements Runnable {
private Clerk cl;
public Consumer(Clerk cl) {
super();
this.cl = cl;
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("消费者开始取走产品!");
while(true){
try {
Thread.sleep((int)(Math.random()*10)*100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
cl.getProduct();//取走产品
}
}
}
//主线程
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Clerk cl=new Clerk();
Thread prt=new Thread(new Producer(cl));//生产者线程
Thread cot=new Thread(new Consumer(cl));//消费者线程
prt.start();
cot.start();
}
}
转载于:https://blog.51cto.com/12170190/1875594