700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java多线程之~~~~使用wait和notify实现生产者消费者模型(LinkedList)

Java多线程之~~~~使用wait和notify实现生产者消费者模型(LinkedList)

时间:2019-08-18 03:22:56

相关推荐

Java多线程之~~~~使用wait和notify实现生产者消费者模型(LinkedList)

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满

的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就

涉及到了在多线程中的条件判断,Java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候

让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作,下面我们用实际的代码来展示如何使用wait和

notify来实现生产者消费者这个经典的模型。

首先是缓冲区的实现,我们使用LinkedList来代替

[java]

packagecom.bird.concursey.charpet2;

importjava.util.Date;

importjava.util.LinkedList;

importjava.util.List;

publicclassEventStorage{

privateintmaxSize;

privateList<Date>storage;

publicEventStorage(){

maxSize=10;

storage=newLinkedList<Date>();

}

publicsynchronizedvoidset(){

while(storage.size()==maxSize){

try{

wait();

}catch(InterruptedExceptione){

e.printStackTrace();

}

}

storage.add(newDate());

System.out.printf("Set:%d",storage.size());

notifyAll();

}

publicsynchronizedvoidget(){

while(storage.size()==0){

try{

wait();

}catch(InterruptedExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

System.out.printf("Get:%d:%s",storage.size(),((LinkedList<?>)storage).poll());

notifyAll();

}

}

然后就是生产者和消费者

[java]

packagecom.bird.concursey.charpet2;

publicclassProducerimplementsRunnable{

privateEventStoragestorge;

publicProducer(EventStoragestorage){

this.storge=storage;

}

@Override

publicvoidrun(){

for(inti=0;i<100;i++){

storge.set();

}

}

}

[java]

packagecom.bird.concursey.charpet2;

publicclassConsumerimplementsRunnable{

privateEventStoragestorage;

publicConsumer(EventStoragestorage){

this.storage=storage;

}

@Override

publicvoidrun(){

for(inti=0;i<100;i++){

storage.get();

}

}

publicstaticvoidmain(String[]args){

EventStoragestorage=newEventStorage();

Producerproducer=newProducer(storage);

Threadthread1=newThread(producer);

Consumerconsumer=newConsumer(storage);

Threadthread2=newThread(consumer);

thread2.start();

thread1.start();

}

}

可以看到,这里面就是用了wait和notifyall方法实现了生产者消费方法,具体的运行过程大家可以通过阅读代码来体

会,还是很直观的。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。