JAVA多线程实现生产者消费者的实例详解
JAVA多线程实现生产者消费者的实例详解
下面的代码实现了生产者消费者的问题
Product.Java
package consumerProducer; public class Product { private String id; public String getId() { return id; } public void setId(String id) { this.id = id; } public Product(String id) { this.id=id; } public String toString() { return "product "+id; } }
Pool.java
package consumerProducer; import java.util.*; public class Pool { private int number=0; private List<Product>products=new LinkedList<Product>(); public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } public synchronized Product consumeProduct(){ //可以去掉synchronized关键字 if(products.size()>0) { Product p= products.get(0); products.remove(0); number--; return p; } else return null; } public synchronized void addProduct(Product p){ //可以去掉synchronized关键字 products.add(p); number++; } }
Consumer.java
package consumerProducer; public class Consumer implements Runnable { private String id; Pool pool; public Consumer(String id,Pool pool) { this.id=id; this.pool=pool; } @Override public void run() { while(!Thread.currentThread().interrupted()) { Product product=null; synchronized(pool){ while(pool.getNumber()<=0)//生产不足 { try { pool.wait();//生产者等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } product=pool.consumeProduct(); } System.out.println("consuming "+id+product.toString()); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Producer.java
package consumerProducer; public class Producer implements Runnable{ private int i_p=0; private String id; Pool pool; int i=0; public Producer(String id ,Pool pool) { this.id=id; this.pool=pool; } public Product createProduct() { return new Product(String.valueOf(++i_p)); } @Override public void run() { // TODO Auto-generated method stub while(!Thread.currentThread().interrupted()) { Product p=new Product(String.valueOf(++i_p)); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized(pool) { pool.addProduct(p); System.out.println("producer "+id+" adding product...."+p.toString()); pool.notifyAll(); } } } }
Main.java
package consumerProducer; public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Pool pool=new Pool(); for(int i=0;i<5;i++) { Thread consumer=new Thread(new Consumer("consumer "+i,pool)); Thread producer=new Thread(new Producer("producer "+i,pool)); consumer.start(); producer.start(); } } }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
赞 (0)