首页 > 开发 > Java > 正文

JAVA多线程实现生产者消费者的实例详解

2024-07-13 10:08:46
字体:
来源:转载
供稿:网友

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();          }   }  } 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表