2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 多线程实现生产者消费者模型

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

时间:2021-06-23 21:40:26

相关推荐

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

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

1 package pers.lan.jc.pc; 2 3 /** 4 * @author lan [1728209643@] 5 * @create -11-27 15:59 6 * @desc 仓库 7 */ 8 public interface Repertory<T> { 9 10int size = 10;11 12void push(T t);13 14T 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@] 9 * @create -11-27 16:4310 * @desc 通过syn, wait, notify实现仓库11 */12 @Slf4j13 public class SynRepertory implements Repertory<Character> {14 15private final ConcurrentLinkedQueue<Character> queue = new ConcurrentLinkedQueue<>();16 17@Override18public 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@Override35public 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@] 7 * @create -11-27 14:34 8 * @desc 测试 9 */10 public class Test {11 12public 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 @Slf4j28 @SuppressWarnings("unchecked")29 class Producer implements Runnable {30 31private Repertory repertory;32 33Producer(Repertory repertory) {34 this.repertory = repertory;35}36 37@Override38public 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 {44Thread.sleep(3000);45 } catch (InterruptedException e) {46e.printStackTrace();47 }48 }49 }50 }51}52 }53 54 @Slf4j55 class Consumer implements Runnable {56 57private Repertory repertory;58 59Consumer(Repertory repertory) {60 this.repertory = repertory;61}62 63@Override64public 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 .1.6\lib\idea_rt.jar=64655:D:\Program Files\JetBrains\IntelliJ IDEA .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 - push11 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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。