JAVA多线程实现生产者消费者的实例详解
JAVA多线程实现生产者消费者的实例详解
下面的代码实现了生产者消费者的问题
Product.Java
packageconsumerProducer;
publicclassProduct{
privateStringid;
publicStringgetId(){
returnid;
}
publicvoidsetId(Stringid){
this.id=id;
}
publicProduct(Stringid)
{
this.id=id;
}
publicStringtoString()
{
return"product"+id;
}
}
Pool.java
packageconsumerProducer;
importjava.util.*;
publicclassPool{
privateintnumber=0;
privateListproducts=newLinkedList();
publicintgetNumber(){
returnnumber;
}
publicvoidsetNumber(intnumber){
this.number=number;
}
publicsynchronizedProductconsumeProduct(){//可以去掉synchronized关键字
if(products.size()>0)
{Productp=products.get(0);
products.remove(0);
number--;
returnp;
}
else
returnnull;
}
publicsynchronizedvoidaddProduct(Productp){//可以去掉synchronized关键字
products.add(p);
number++;
}
}
Consumer.java
packageconsumerProducer;
publicclassConsumerimplementsRunnable{
privateStringid;
Poolpool;
publicConsumer(Stringid,Poolpool)
{
this.id=id;
this.pool=pool;
}
@Override
publicvoidrun(){
while(!Thread.currentThread().interrupted())
{
Productproduct=null;
synchronized(pool){
while(pool.getNumber()<=0)//生产不足
{
try{
pool.wait();//生产者等待
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
product=pool.consumeProduct();
}
System.out.println("consuming"+id+product.toString());
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}
Producer.java
packageconsumerProducer;
publicclassProducerimplementsRunnable{
privateinti_p=0;
privateStringid;
Poolpool;
inti=0;
publicProducer(Stringid,Poolpool)
{
this.id=id;
this.pool=pool;
}
publicProductcreateProduct()
{
returnnewProduct(String.valueOf(++i_p));
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
while(!Thread.currentThread().interrupted())
{
Productp=newProduct(String.valueOf(++i_p));
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
synchronized(pool)
{
pool.addProduct(p);
System.out.println("producer"+id+"addingproduct...."+p.toString());
pool.notifyAll();
}
}
}
}
Main.java
packageconsumerProducer;
publicclassMain{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Poolpool=newPool();
for(inti=0;i<5;i++)
{
Threadconsumer=newThread(newConsumer("consumer"+i,pool));
Threadproducer=newThread(newProducer("producer"+i,pool));
consumer.start();
producer.start();
}
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!