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(); } } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!