线程间的通信
典型例子就是生产者-消费者模式,仓库为空时,消费者无法从仓库调动产品,只能wait,直到仓库有产品时被notify;仓库满了时,生产者则暂时停止生产(wait),直到仓库有空被notify。
仓库售货员类:
package com.sy.iodemo;
public class Clerk {
private int product =0;
public synchronized void addProduct(){
if(product >= 10){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}else{
product++;
System.out.println("生产者生产了第"+product+"个产品");
notifyAll();
}
}
public synchronized void getProduct(){
if(product <=0){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}else{
System.out.println("消费者取走了第"+product+"个产品");
product--;
notifyAll();
}
}
}
生产者类:
package com.sy.iodemo;
public class Productor implements Runnable{
Clerk clerk;
public Productor(Clerk clerk){
this.clerk = clerk;
}
public void run(){
while(true){
try{
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}
clerk.addProduct();
}
}
}
消费者类:
package com.sy.iodemo;
public class Consumer implements Runnable{
Clerk clerk;
public Consumer(Clerk clerk){
this.clerk = clerk;
}
public void run(){
while(true){
try{
Thread.sleep(2000);
}catch(InterruptedException e){
e.printStackTrace();
}
clerk.getProduct();
}
}
}
结果(部分):
生产者生产了第1个产品
生产者生产了第2个产品
消费者取走了第2个产品
生产者生产了第2个产品
消费者取走了第2个产品
生产者生产了第2个产品
消费者取走了第2个产品
生产者生产了第2个产品
消费者取走了第2个产品
还没有评论,来说两句吧...