java生產者與消費者
阿新 • • 發佈:2018-12-16
生產者與消費者模式
- 直接上程式碼
public class StoreHouse { private int capacity; private AtomicInteger size = new AtomicInteger(0); private BlockingQueue<Integer> queue; public StoreHouse(int capacity) { this.capacity = capacity; queue = new ArrayBlockingQueue<>(capacity); } public void producer(int productId) { try { queue.put(productId); } catch (InterruptedException e) { e.printStackTrace(); } size.incrementAndGet(); System.out.println("生成了產品"+productId); } public void consumer() { int productId = 0; try { productId = queue.take(); } catch (InterruptedException e) { e.printStackTrace(); } size.decrementAndGet(); System.out.println("當前總產品數:"+size+",消費了產品:"+productId); } public static void main(String[] args) { StoreHouse storehouse = new StoreHouse(16); new Thread(new ProducerRunnable(storehouse)).start(); new Thread(new ConsumerRunnable(storehouse)).start(); } } class ProducerRunnable implements Runnable { // 所在放置的倉庫 private StoreHouse storehouse; public ProducerRunnable(StoreHouse storehouse) { this.storehouse = storehouse; } @Override public void run() { while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } int productId = new Random().nextInt(100); storehouse.producer(productId); } } } class ConsumerRunnable implements Runnable { // 所在放置的倉庫 private StoreHouse storehouse; public ConsumerRunnable(StoreHouse storehouse) { this.storehouse = storehouse; } @Override public void run() { while(true) { try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } storehouse.consumer(); } } }
2.總結:a.多個操作方法(生成/消費)最好放在同一個操作類裡面,便於同步使用 b.阻塞同步佇列可實現訊息通知