生產者消費者模型: 1. 商品 2. 倉庫 3. 生產者 4. 消費者 整個過程大致為:生產者將生產的商品放到倉庫存儲,消費者將倉庫中的商品取出;其中,當庫存為零時,消費者會通知生產進行生產;當庫存已滿時,生產者通知消費者進行消費.
Storage.java
package com.pc.storage;import java.util.ArrayList;import java.util.List;import com.pc.product.Product;public class Storage<E extends Product> { private int capacity = 10; private List<E> productsList; public Storage() { productsList = new ArrayList<E>(capacity); } public Storage(int capacity) { if (capacity <= 0) { this.capacity = capacity; } productsList = new ArrayList<E>(capacity); } public void put(E e) { synchronized (productsList) { if (productsList.size() == capacity) { try { productsList.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } } else { productsList.add(e); productsList.notifyAll(); } } } public E take() { synchronized (productsList) { if (productsList.size() == 0) { try { productsList.wait(); } catch (InterruptedException e1) { e1.printStackTrace(); } } else { productsList.notifyAll(); return productsList.remove(0); } return null; } }}Producer.java
package com.pc.producer;import com.pc.product.Product;import com.pc.storage.Storage;public class Producer implements Runnable { private Storage<Product> storage; public Producer(Storage<Product> storage) { this.storage = storage; } @Override public void run() { while (true) { synchronized (storage) { Product p = new Product("Product"); storage.put(p); System.out.println(Thread.currentThread().getName() + "/t生產者: " + p); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}Consumer.java
package com.pc.consumer;import com.pc.product.Product;import com.pc.storage.Storage;public class Consumer implements Runnable{ private Storage<Product> storage; public Consumer(Storage<Product> storage) { this.storage = storage; } @Override public void run() { while(true){ Product p = storage.take(); if(p != null){ System.out.println(Thread.currentThread().getName() + "/t消費者: "+p); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}Test.java
package com.pc.test;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import com.pc.consumer.Consumer;import com.pc.producer.Producer;import com.pc.product.Product;import com.pc.storage.Storage;public class Test { public static void main(String[] args) { Storage<Product> storage = new Storage<Product>(); Producer producer1 = new Producer(storage); Producer producer2 = new Producer(storage); Consumer consumer1 = new Consumer(storage); Consumer consumer2 = new Consumer(storage); Consumer consumer3 = new Consumer(storage); Consumer consumer4 = new Consumer(storage); ExecutorService executorService = Executors.newCachedThreadPool(); executorService.submit(producer1); executorService.submit(producer2); executorService.submit(consumer1); executorService.submit(consumer2); executorService.submit(consumer3); executorService.submit(consumer4); }}測試結果:
pool-1-thread-2 生產者: Product [no=1, name=Product]pool-1-thread-4 消費者: Product [no=1, name=Product]pool-1-thread-1 生產者: Product [no=2, name=Product]pool-1-thread-6 消費者: Product [no=2, name=Product]pool-1-thread-2 生產者: Product [no=3, name=Product]pool-1-thread-4 消費者: Product [no=3, name=Product]pool-1-thread-1 生產者: Product [no=4, name=Product]pool-1-thread-6 消費者: Product [no=4, name=Product]pool-1-thread-2 生產者: Product [no=5, name=Product]pool-1-thread-1 生產者: Product [no=6, name=Product]pool-1-thread-4 消費者: Product [no=5, name=Product]pool-1-thread-6 消費者: Product [no=6, name=Product]pool-1-thread-2 生產者: Product [no=7, name=Product]pool-1-thread-1 生產者: Product [no=8, name=Product]pool-1-thread-4 消費者: Product [no=7, name=Product]pool-1-thread-6 消費者: Product [no=8, name=Product]pool-1-thread-1 生產者: Product [no=9, name=Product]pool-1-thread-2 生產者: Product [no=10, name=Product]pool-1-thread-4 消費者: Product [no=9, name=Product]pool-1-thread-6 消費者: Product [no=10, name=Product]pool-1-thread-1 生產者: Product [no=11, name=Product]pool-1-thread-2 生產者: Product [no=12, name=Product]pool-1-thread-4 消費者: Product [no=11, name=Product]pool-1-thread-6 消費者: Product [no=12, name=Product]pool-1-thread-1 生產者: Product [no=13, name=Product]pool-1-thread-5 消費者: Product [no=13, name=Product]pool-1-thread-2 生產者: Product [no=14, name=Product]pool-1-thread-6 消費者: Product [no=14, name=Product]新聞熱點
疑難解答