国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

生產者與消費者之實現(wait、notify)

2019-11-11 01:15:27
字體:
來源:轉載
供稿:網友

經典的多線程問題

生產者消費者模型: 1. 商品 2. 倉庫 3. 生產者 4. 消費者 整個過程大致為:生產者將生產的商品放到倉庫存儲,消費者將倉庫中的商品取出;其中,當庫存為零時,消費者會通知生產進行生產;當庫存已滿時,生產者通知消費者進行消費.

代碼

PRoduct.java

package com.pc.product;import java.io.Serializable;public class Product implements Serializable { private static int counter = 0; private int no = ++counter; private String name; public Product(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Product [no=" + no + ", name=" + name + "]"; }}

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]
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 武陟县| 车致| 桃源县| 乌拉特前旗| 长治市| 奉贤区| 灯塔市| 贵德县| 兴安盟| 乐昌市| 常州市| 安丘市| 南丰县| 盐山县| 教育| 麻栗坡县| 灵川县| 五大连池市| 右玉县| 萨迦县| 株洲市| 广汉市| 偏关县| 云浮市| 潮州市| 冕宁县| 香港| 都兰县| 宕昌县| 兰溪市| 漳平市| 衡阳市| 武城县| 辽中县| 庆城县| 临朐县| 天峨县| 红河县| 平利县| 额尔古纳市| 门头沟区|