多线程之生产者与消费者问题

xiaoxiao2021-02-28  63

生产者生产产品后将产品放在一个仓库里,消费者购买省商品相当于从仓库里拿出商品。这其中涉及到的有生产者、消费者与仓库以及产品四个对象,因此需要创建四个类来表示。最后还需要一个测试类。对于生成与消费这两个动作可是是同时执行的(只要有商品的话),因此需要使用到多线程的知识。 product类 public class Product{ private int id;//根据id来标识产产品 public Product41(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } } Storage类 public class Storage{ Product[] ps = new Product[10];//该仓库只可以装10件商品 int index; //因为不止一个生产者生产产品,所以向仓库中添加商品的方法需要 //使用到锁的机制(synchoronized) public synchronized void push(Prodeuct p){ //如果仓库已经装满了产品那么就停止生产 while(index == ps.length){ try { this.wait();//暂停该线程 } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll();//唤醒该线程 ps[index] = p; index++; } //取出产品的方法 public synchronized Product pop(){ while (index == 0) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } this.notifyAll(); index--; return ps[index]; } } Producer类 public class Producer extends Thread{ Storage storage;//生产者需要将生产出来的产品放在仓库 public Producer(Storage storage){ this.storage = storage; } //因为继承了Thread类,所以需要重写Run方法 @override public void run(){ System.out.println("生产者"+getName()+"生产了一件商品"); Product p = new Product(i);//生产一件产品 storage.push(p);//将产品添加到仓库 try{ sleep(300); }catch(InterruptedException e){ e.printStackTrace(); } } } Customer类 public class Customer extends Thread{ Storage storage;//消费者需要从仓库中取出产品 public Customer(Storage storage){ this.storage = storage; } @override public void run(){ for(int i = 0; i < 20; i++){ //从仓库中取出产品 Product p = storage.pop(); System.out.println("消费者"+getName()+"消费了一件产品"); try { sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } } } TestMain类 public class Test{ public static void main(String[] args){ //建立一个仓库 Storage s = new Storage(); //创建生产者与消费者 Customer c1 = new Customer(s); //为该线程设置一个名字 c1.setName("c1"); Customer c2 = new Customer(s); c2.setName("c2"); Producer p1 = new Producer(s); p1.setName("p1"); Producer p2 = new Producer(s); p2.setName("p2"); //启动线程 p1.start(); p2.start(); c1.start(); c2.start(); } }
转载请注明原文地址: https://www.6miu.com/read-51004.html

最新回复(0)