首先是一個倉庫接口,該接口規定的倉庫大小,倉庫的存取方法,以下所示java
1 package pers.lan.jc.pc; 2 3 /** 4 * @author lan [1728209643@qq.com] 5 * @create 2018-11-27 15:59 6 * @desc 倉庫 7 */ 8 public interface Repertory<T> { 9 10 int size = 10; 11 12 void push(T t); 13 14 T pop(); 15 }
而後就是具體的倉庫設計,我利用設計了兩種不一樣實現方式的倉庫,以下web
第一種:spring
1 package pers.lan.jc.pc; 2 3 import lombok.extern.slf4j.Slf4j; 4 5 import java.util.concurrent.ConcurrentLinkedQueue; 6 7 /** 8 * @author lan [1728209643@qq.com] 9 * @create 2018-11-27 16:43 10 * @desc 經過syn, wait, notify實現倉庫 11 */ 12 @Slf4j 13 public class SynRepertory implements Repertory<Character> { 14 15 private final ConcurrentLinkedQueue<Character> queue = new ConcurrentLinkedQueue<>(); 16 17 @Override 18 public void push(Character character) { 19 synchronized (queue) { 20 if (queue.size() >= size) { 21 try { 22 log.info("滿了等待"); 23 queue.wait(); 24 } catch (InterruptedException e) { 25 e.printStackTrace(); 26 } 27 } 28 log.info("push: " + character); 29 queue.add(character); 30 queue.notify(); 31 } 32 } 33 34 @Override 35 public Character pop() { 36 synchronized (queue) { 37 if (queue.isEmpty()) { 38 try { 39 log.info("空,等待"); 40 queue.wait(); 41 } catch (InterruptedException e) { 42 e.printStackTrace(); 43 } 44 } 45 Character character = queue.poll(); 46 log.info("pop: " + character); 47 48 queue.notify(); 49 return character; 50 } 51 } 52 }
第二種:express
1 package pers.lan.jc.pc; 2 3 import lombok.extern.slf4j.Slf4j; 4 5 /** 6 * @author lan [1728209643@qq.com] 7 * @create 2018-11-27 14:34 8 * @desc 測試 9 */ 10 public class Test { 11 12 public static void main(String[] args) { 13 Repertory repertory = new LockRepertory(); 14 // Repertory repertory = new SynRepertory(); 15 Producer producer = new Producer(repertory); 16 Consumer consumer = new Consumer(repertory); 17 new Thread(producer).start(); 18 try { 19 Thread.sleep(6000); 20 } catch (InterruptedException e) { 21 e.printStackTrace(); 22 } 23 new Thread(consumer).start(); 24 } 25 } 26 27 @Slf4j 28 @SuppressWarnings("unchecked") 29 class Producer implements Runnable { 30 31 private Repertory repertory; 32 33 Producer(Repertory repertory) { 34 this.repertory = repertory; 35 } 36 37 @Override 38 public void run() { 39 while (true) { 40 for (int j = 0; j < Character.MAX_VALUE; j++) { 41 repertory.push((char) j); 42 if (j > 15) { 43 try { 44 Thread.sleep(3000); 45 } catch (InterruptedException e) { 46 e.printStackTrace(); 47 } 48 } 49 } 50 } 51 } 52 } 53 54 @Slf4j 55 class Consumer implements Runnable { 56 57 private Repertory repertory; 58 59 Consumer(Repertory repertory) { 60 this.repertory = repertory; 61 } 62 63 @Override 64 public void run() { 65 while (true) { 66 repertory.pop(); 67 try { 68 Thread.sleep(100); 69 } catch (InterruptedException e) { 70 e.printStackTrace(); 71 } 72 } 73 } 74 }
測試代碼主要是定義了生產者和消費者自己的行爲規則
運行結果示例apache
1 "D:\Program Files\Java\jdk1.8.0_171\bin\java.exe" -Dvisualvm.id=21826384117779 "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2018.1.6\lib\idea_rt.jar=64655:D:\Program Files\JetBrains\IntelliJ IDEA 2018.1.6\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;D:\Projects\jc\java-conc\target\classes;D:\Repository\org\springframework\boot\spring-boot-starter-web\2.0.5.RELEASE\spring-boot-starter-web-2.0.5.RELEASE.jar;D:\Repository\org\springframework\boot\spring-boot-starter\2.0.5.RELEASE\spring-boot-starter-2.0.5.RELEASE.jar;D:\Repository\org\springframework\boot\spring-boot\2.0.5.RELEASE\spring-boot-2.0.5.RELEASE.jar;D:\Repository\org\springframework\boot\spring-boot-autoconfigure\2.0.5.RELEASE\spring-boot-autoconfigure-2.0.5.RELEASE.jar;D:\Repository\org\springframework\boot\spring-boot-starter-logging\2.0.5.RELEASE\spring-boot-starter-logging-2.0.5.RELEASE.jar;D:\Repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\Repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\Repository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;D:\Repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;D:\Repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\Repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\Repository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;D:\Repository\org\springframework\boot\spring-boot-starter-json\2.0.5.RELEASE\spring-boot-starter-json-2.0.5.RELEASE.jar;D:\Repository\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;D:\Repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\Repository\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;D:\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;D:\Repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;D:\Repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;D:\Repository\org\hibernate\validator\hibernate-validator\6.0.12.Final\hibernate-validator-6.0.12.Final.jar;D:\Repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\Repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;D:\Repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;D:\Repository\org\springframework\spring-web\5.0.9.RELEASE\spring-web-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-beans\5.0.9.RELEASE\spring-beans-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-webmvc\5.0.9.RELEASE\spring-webmvc-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-aop\5.0.9.RELEASE\spring-aop-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-context\5.0.9.RELEASE\spring-context-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-expression\5.0.9.RELEASE\spring-expression-5.0.9.RELEASE.jar;D:\Repository\org\springframework\boot\spring-boot-starter-undertow\2.0.5.RELEASE\spring-boot-starter-undertow-2.0.5.RELEASE.jar;D:\Repository\io\undertow\undertow-core\1.4.25.Final\undertow-core-1.4.25.Final.jar;D:\Repository\org\jboss\xnio\xnio-api\3.3.8.Final\xnio-api-3.3.8.Final.jar;D:\Repository\org\jboss\xnio\xnio-nio\3.3.8.Final\xnio-nio-3.3.8.Final.jar;D:\Repository\io\undertow\undertow-servlet\1.4.25.Final\undertow-servlet-1.4.25.Final.jar;D:\Repository\org\jboss\spec\javax\annotation\jboss-annotations-api_1.2_spec\1.0.2.Final\jboss-annotations-api_1.2_spec-1.0.2.Final.jar;D:\Repository\io\undertow\undertow-websockets-jsr\1.4.25.Final\undertow-websockets-jsr-1.4.25.Final.jar;D:\Repository\org\jboss\spec\javax\websocket\jboss-websocket-api_1.1_spec\1.1.3.Final\jboss-websocket-api_1.1_spec-1.1.3.Final.jar;D:\Repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;D:\Repository\org\glassfish\javax.el\3.0.0\javax.el-3.0.0.jar;D:\Repository\org\springframework\boot\spring-boot-starter-data-jpa\2.0.5.RELEASE\spring-boot-starter-data-jpa-2.0.5.RELEASE.jar;D:\Repository\org\springframework\boot\spring-boot-starter-aop\2.0.5.RELEASE\spring-boot-starter-aop-2.0.5.RELEASE.jar;D:\Repository\org\aspectj\aspectjweaver\1.8.13\aspectjweaver-1.8.13.jar;D:\Repository\org\springframework\boot\spring-boot-starter-jdbc\2.0.5.RELEASE\spring-boot-starter-jdbc-2.0.5.RELEASE.jar;D:\Repository\com\zaxxer\HikariCP\2.7.9\HikariCP-2.7.9.jar;D:\Repository\org\springframework\spring-jdbc\5.0.9.RELEASE\spring-jdbc-5.0.9.RELEASE.jar;D:\Repository\javax\transaction\javax.transaction-api\1.2\javax.transaction-api-1.2.jar;D:\Repository\org\hibernate\hibernate-core\5.2.17.Final\hibernate-core-5.2.17.Final.jar;D:\Repository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.2.Final\hibernate-jpa-2.1-api-1.0.2.Final.jar;D:\Repository\org\javassist\javassist\3.22.0-GA\javassist-3.22.0-GA.jar;D:\Repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;D:\Repository\org\jboss\jandex\2.0.3.Final\jandex-2.0.3.Final.jar;D:\Repository\dom4j\dom4j\1.6.1\dom4j-1.6.1.jar;D:\Repository\org\hibernate\common\hibernate-commons-annotations\5.0.1.Final\hibernate-commons-annotations-5.0.1.Final.jar;D:\Repository\org\springframework\data\spring-data-jpa\2.0.10.RELEASE\spring-data-jpa-2.0.10.RELEASE.jar;D:\Repository\org\springframework\data\spring-data-commons\2.0.10.RELEASE\spring-data-commons-2.0.10.RELEASE.jar;D:\Repository\org\springframework\spring-orm\5.0.9.RELEASE\spring-orm-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-tx\5.0.9.RELEASE\spring-tx-5.0.9.RELEASE.jar;D:\Repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\Repository\org\springframework\spring-aspects\5.0.9.RELEASE\spring-aspects-5.0.9.RELEASE.jar;D:\Repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;D:\Repository\org\projectlombok\lombok\1.16.22\lombok-1.16.22.jar;D:\Repository\org\springframework\spring-core\5.0.9.RELEASE\spring-core-5.0.9.RELEASE.jar;D:\Repository\org\springframework\spring-jcl\5.0.9.RELEASE\spring-jcl-5.0.9.RELEASE.jar" pers.lan.jc.pc.Test 2 16:48:38.984 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 3 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 4 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 5 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 6 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 7 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 8 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 9 16:48:38.989 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 10 16:48:38.990 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push 11 16:48:38.990 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 12 16:48:38.990 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 13 16:48:44.975 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 14 16:48:44.975 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 15 16 16:48:44.975 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 17 16:48:45.075 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 18 16:48:45.075 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 19 16:48:45.075 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 20 16:48:45.175 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 21 16:48:45.175 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 22 16:48:45.175 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 23 16:48:45.277 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 24 16:48:45.277 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 25 16:48:45.277 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 26 16:48:45.377 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 27 16:48:45.377 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 28 16:48:45.377 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 29 16:48:45.477 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 30 16:48:45.477 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 31 16:48:45.477 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - 滿了,等待 32 16:48:45.578 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 33 16:48:45.578 [Thread-0] INFO pers.lan.jc.pc.LockRepertory - push: 34 16:48:45.678 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 35 16:48:45.778 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 36 16:48:45.878 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 37 16:48:45.979 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 38 39 16:48:46.079 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 40 16:48:46.179 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 41 16:48:46.279 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 42 16:48:46.379 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 43 16:48:46.479 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 44 16:48:46.580 [Thread-1] INFO pers.lan.jc.pc.LockRepertory - pop: 45 46 Process finished with exit code -1