多线程实现生产者消费者模型

首先是一个仓库接口,该接口规定的仓库大小,仓库的存取方法,如下所示

 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 }

然后就是具体的仓库设计,我利用设计了两种不同实现方式的仓库,如下

第一种:

 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 }

第二种:

 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 }

测试代码主要是定义了生产者和消费者本身的行为规则

运行结果示例

 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

 

转载于:https://www.cnblogs.com/qq1728209643/p/10027363.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值