关键词搜索

源码搜索 ×
×

Java实现生产者消费者的PV操作信号量操作

发布2022-03-14浏览2581次

详情内容

目录

信号量

生产者

消费者

单元测试

Java信号量测试


定义一个信号量对象,同时定义生产者和消费者,让生产者和消费者互相等待。生产者每次生产一个对象放入队列,通知消费者消费;消费者每次只消费一个队列对象数据,消费完再通知生产者生产。

信号量

信号量就是一个能够进入消费和生产的标志。

  1. public class Signal {
  2. /**
  3. * 每次处理的次数
  4. */
  5. public static final int times = 100;
  6. /**
  7. * 信号量标识
  8. */
  9. public static AtomicInteger signal = new AtomicInteger(0);
  10. /**
  11. * 队列
  12. */
  13. public static LinkedBlockingDeque queue = new LinkedBlockingDeque();
  14. }

生产者

  1. @Data
  2. @Slf4j
  3. public class Producer implements Runnable{
  4. public Producer() {
  5. }
  6. int count = 0;
  7. @Override
  8. public void run() {
  9. while (count < Signal.times){
  10. // 生产条件
  11. if(Signal.signal.get() >= 0 && Signal.queue.size() == 0){
  12. try {
  13. synchronized (Signal.signal){
  14. // P操作-1
  15. log.info("生产者: P操作 -1 ");
  16. Signal.signal.incrementAndGet();
  17. log.info("生产者: 生产,放入一个对象");
  18. Signal.queue.add(new Object());
  19. count ++;
  20. // V操作+1
  21. log.info("生产者: V操作 +1 ");
  22. Signal.signal.decrementAndGet();
  23. log.info("生产者: 通知消费者,生产者阻塞");
  24. Signal.signal.notifyAll();
  25. // 阻塞
  26. Signal.signal.wait();
  27. }
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. }else{
  32. // 等待
  33. try {
  34. Thread.sleep(10);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. }
  41. }

消费者

  1. @Data
  2. @Slf4j
  3. public class Consumer implements Runnable{
  4. int count = 0;
  5. public Consumer() {
  6. }
  7. @Override
  8. public void run() {
  9. while (count < Signal.times){
  10. // 生产条件
  11. if(Signal.signal.get() <= 0 && Signal.queue.size() > 0){
  12. try {
  13. synchronized (Signal.signal){
  14. // P操作-1
  15. log.info("消费者: P操作 -1 ");
  16. Signal.signal.decrementAndGet();
  17. log.info("消费者: 消费,拿走一个对象");
  18. Signal.queue.poll();
  19. count ++;
  20. // V操作+1
  21. log.info("消费者: V操作 +1 ");
  22. Signal.signal.incrementAndGet();
  23. log.info("消费者: 通知生产者,消费者阻塞");
  24. Signal.signal.notifyAll();
  25. // 阻塞
  26. Signal.signal.wait();
  27. }
  28. } catch (InterruptedException e) {
  29. e.printStackTrace();
  30. }
  31. }else{
  32. // 等待
  33. try {
  34. Thread.sleep(10);
  35. } catch (InterruptedException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. }
  41. }

单元测试

  1. @Slf4j
  2. public class PVTests {
  3. @Test
  4. public void test(){
  5. Producer producer = new Producer();
  6. Consumer consumer = new Consumer();
  7. new Thread(producer).start();
  8. new Thread(consumer).start();
  9. try {
  10. Thread.sleep(10000);
  11. log.info("producer: count = {}",producer.getCount());
  12. log.info("consumer:count = {}",consumer.getCount());
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }

输出结果:

  1. "C:\Program Files\Java\jdk1.8.0_291\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63700,suspend=y,server=n -ea -Didea.test.cyclic.buffer.size=1048576 -javaagent:C:\Users\boonya\AppData\Local\JetBrains\IntelliJIdea2021.2\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "E:\Program Files\JetBrains\IntelliJ IDEA 2021.2.3\lib\idea_rt.jar;E:\Program Files\JetBrains\IntelliJ IDEA 2021.2.3\plugins\junit\lib\junit5-rt.jar;E:\Program Files\JetBrains\IntelliJ IDEA 2021.2.3\plugins\junit\lib\junit-rt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_291\jre\lib\rt.jar;F:\lwjCode\test\target\test-classes;F:\lwjCode\test\target\classes;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-starter-web\2.3.5.RELEASE\spring-boot-starter-web-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-starter\2.3.5.RELEASE\spring-boot-starter-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot\2.3.5.RELEASE\spring-boot-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-autoconfigure\2.3.5.RELEASE\spring-boot-autoconfigure-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-starter-logging\2.3.5.RELEASE\spring-boot-starter-logging-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\apache\logging\log4j\log4j-to-slf4j\2.13.3\log4j-to-slf4j-2.13.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\apache\logging\log4j\log4j-api\2.13.3\log4j-api-2.13.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\slf4j\jul-to-slf4j\1.7.30\jul-to-slf4j-1.7.30.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\jakarta\annotation\jakarta.annotation-api\1.3.5\jakarta.annotation-api-1.3.5.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\yaml\snakeyaml\1.26\snakeyaml-1.26.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-starter-json\2.3.5.RELEASE\spring-boot-starter-json-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\fasterxml\jackson\core\jackson-databind\2.11.3\jackson-databind-2.11.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\fasterxml\jackson\core\jackson-annotations\2.11.3\jackson-annotations-2.11.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\fasterxml\jackson\core\jackson-core\2.11.3\jackson-core-2.11.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.11.3\jackson-datatype-jdk8-2.11.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.11.3\jackson-datatype-jsr310-2.11.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.11.3\jackson-module-parameter-names-2.11.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-starter-tomcat\2.3.5.RELEASE\spring-boot-starter-tomcat-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\apache\tomcat\embed\tomcat-embed-core\9.0.39\tomcat-embed-core-9.0.39.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\glassfish\jakarta.el\3.0.3\jakarta.el-3.0.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.39\tomcat-embed-websocket-9.0.39.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-web\5.2.10.RELEASE\spring-web-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-beans\5.2.10.RELEASE\spring-beans-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-webmvc\5.2.10.RELEASE\spring-webmvc-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-aop\5.2.10.RELEASE\spring-aop-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-context\5.2.10.RELEASE\spring-context-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-expression\5.2.10.RELEASE\spring-expression-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-starter-test\2.3.5.RELEASE\spring-boot-starter-test-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-test\2.3.5.RELEASE\spring-boot-test-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\boot\spring-boot-test-autoconfigure\2.3.5.RELEASE\spring-boot-test-autoconfigure-2.3.5.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\jayway\jsonpath\json-path\2.4.0\json-path-2.4.0.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\net\minidev\json-smart\2.3\json-smart-2.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\net\minidev\accessors-smart\1.2\accessors-smart-1.2.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\ow2\asm\asm\5.0.4\asm-5.0.4.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\slf4j\slf4j-api\1.7.30\slf4j-api-1.7.30.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\jakarta\xml\bind\jakarta.xml.bind-api\2.3.3\jakarta.xml.bind-api-2.3.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\jakarta\activation\jakarta.activation-api\1.2.2\jakarta.activation-api-1.2.2.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\assertj\assertj-core\3.16.1\assertj-core-3.16.1.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\hamcrest\hamcrest\2.2\hamcrest-2.2.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\jupiter\junit-jupiter\5.6.3\junit-jupiter-5.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\jupiter\junit-jupiter-api\5.6.3\junit-jupiter-api-5.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\opentest4j\opentest4j\1.2.0\opentest4j-1.2.0.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\platform\junit-platform-commons\1.6.3\junit-platform-commons-1.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\jupiter\junit-jupiter-params\5.6.3\junit-jupiter-params-5.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\jupiter\junit-jupiter-engine\5.6.3\junit-jupiter-engine-5.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\vintage\junit-vintage-engine\5.6.3\junit-vintage-engine-5.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\apiguardian\apiguardian-api\1.1.0\apiguardian-api-1.1.0.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\junit\platform\junit-platform-engine\1.6.3\junit-platform-engine-1.6.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\junit\junit\4.13.1\junit-4.13.1.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\mockito\mockito-core\3.3.3\mockito-core-3.3.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\net\bytebuddy\byte-buddy\1.10.17\byte-buddy-1.10.17.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\net\bytebuddy\byte-buddy-agent\1.10.17\byte-buddy-agent-1.10.17.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\objenesis\objenesis\2.6\objenesis-2.6.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\mockito\mockito-junit-jupiter\3.3.3\mockito-junit-jupiter-3.3.3.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\skyscreamer\jsonassert\1.5.0\jsonassert-1.5.0.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\com\vaadin\external\google\android-json\0.0.20131108.vaadin1\android-json-0.0.20131108.vaadin1.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-core\5.2.10.RELEASE\spring-core-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-jcl\5.2.10.RELEASE\spring-jcl-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\springframework\spring-test\5.2.10.RELEASE\spring-test-5.2.10.RELEASE.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\xmlunit\xmlunit-core\2.7.0\xmlunit-core-2.7.0.jar;D:\DEVELOPERS\MAVEN\apache-maven-3.5.0\repository\org\projectlombok\lombok\1.18.22\lombok-1.18.22.jar" com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit4 com.example.test.PVTests
  2. Connected to the target VM, address: '127.0.0.1:63700', transport: 'socket'
  3. 16:14:18.444 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  4. 16:14:18.448 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  5. 16:14:18.448 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  6. 16:14:18.448 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  7. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  8. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  9. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  10. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  11. 16:14:18.461 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  12. 16:14:18.461 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  13. 16:14:18.461 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  14. 16:14:18.461 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  15. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  16. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  17. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  18. 16:14:18.461 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  19. 16:14:18.461 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  20. 16:14:18.461 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  21. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  22. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  23. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  24. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  25. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  26. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  27. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  28. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  29. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  30. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  31. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  32. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  33. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  34. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  35. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  36. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  37. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  38. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  39. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  40. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  41. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  42. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  43. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  44. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  45. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  46. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  47. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  48. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  49. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  50. 16:14:18.462 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  51. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  52. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  53. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  54. 16:14:18.462 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  55. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  56. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  57. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  58. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  59. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  60. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  61. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  62. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  63. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  64. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  65. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  66. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  67. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  68. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  69. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  70. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  71. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  72. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  73. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  74. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  75. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  76. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  77. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  78. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  79. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  80. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  81. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  82. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  83. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  84. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  85. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  86. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  87. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  88. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  89. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  90. 16:14:18.463 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  91. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  92. 16:14:18.463 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  93. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  94. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  95. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  96. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  97. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  98. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  99. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  100. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  101. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  102. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  103. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  104. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  105. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  106. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  107. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  108. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  109. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  110. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  111. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  112. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  113. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  114. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  115. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  116. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  117. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  118. 16:14:18.464 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  119. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  120. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  121. 16:14:18.464 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  122. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  123. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  124. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  125. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  126. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  127. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  128. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  129. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  130. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  131. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  132. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  133. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  134. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  135. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  136. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  137. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  138. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  139. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  140. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  141. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  142. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  143. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  144. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  145. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  146. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  147. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  148. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  149. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  150. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  151. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  152. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  153. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  154. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  155. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  156. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  157. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  158. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  159. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  160. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  161. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  162. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  163. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  164. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  165. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  166. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  167. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  168. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  169. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  170. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  171. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  172. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  173. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  174. 16:14:18.465 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  175. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  176. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  177. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  178. 16:14:18.465 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  179. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  180. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  181. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  182. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  183. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  184. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  185. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  186. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  187. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  188. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  189. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  190. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  191. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  192. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  193. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  194. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  195. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  196. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  197. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  198. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  199. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  200. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  201. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  202. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  203. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  204. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  205. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  206. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  207. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  208. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  209. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  210. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  211. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  212. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  213. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  214. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  215. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  216. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  217. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  218. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  219. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  220. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  221. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  222. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  223. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  224. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  225. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  226. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  227. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  228. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  229. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  230. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  231. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  232. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  233. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  234. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  235. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  236. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  237. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  238. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  239. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  240. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  241. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  242. 16:14:18.466 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  243. 16:14:18.466 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  244. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  245. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  246. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  247. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  248. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  249. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  250. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  251. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  252. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  253. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  254. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  255. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  256. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  257. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  258. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  259. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  260. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  261. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  262. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  263. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  264. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  265. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  266. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  267. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  268. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  269. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  270. 16:14:18.467 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  271. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  272. 16:14:18.467 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  273. 16:14:18.468 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  274. 16:14:18.468 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  275. 16:14:18.468 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  276. 16:14:18.468 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  277. 16:14:18.468 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  278. 16:14:18.468 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  279. 16:14:18.468 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  280. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  281. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  282. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  283. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  284. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  285. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  286. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  287. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  288. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  289. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  290. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  291. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  292. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  293. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  294. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  295. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  296. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  297. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  298. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  299. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  300. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  301. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  302. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  303. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  304. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  305. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  306. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  307. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  308. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  309. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  310. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  311. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  312. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  313. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  314. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  315. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  316. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  317. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  318. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  319. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  320. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  321. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  322. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  323. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  324. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  325. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  326. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  327. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  328. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  329. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  330. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  331. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  332. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  333. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  334. 16:14:18.469 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  335. 16:14:18.469 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  336. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  337. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  338. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  339. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  340. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  341. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  342. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  343. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  344. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  345. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  346. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  347. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  348. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  349. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  350. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  351. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  352. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  353. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  354. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  355. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  356. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  357. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  358. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  359. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  360. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  361. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  362. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  363. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  364. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  365. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  366. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  367. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  368. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  369. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  370. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  371. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  372. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  373. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  374. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  375. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  376. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  377. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  378. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  379. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  380. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  381. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  382. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  383. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  384. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  385. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  386. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  387. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  388. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  389. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  390. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  391. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  392. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  393. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  394. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  395. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  396. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  397. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  398. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  399. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  400. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  401. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  402. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  403. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  404. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  405. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  406. 16:14:18.470 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  407. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  408. 16:14:18.470 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  409. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  410. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  411. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  412. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  413. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  414. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  415. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  416. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  417. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  418. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  419. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  420. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  421. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  422. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  423. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  424. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  425. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  426. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  427. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  428. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  429. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  430. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  431. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  432. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  433. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  434. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  435. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  436. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  437. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  438. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  439. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  440. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  441. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  442. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  443. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  444. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  445. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  446. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  447. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  448. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  449. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  450. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  451. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  452. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  453. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  454. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  455. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  456. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  457. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  458. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  459. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  460. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  461. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  462. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  463. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  464. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  465. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  466. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  467. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  468. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  469. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  470. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  471. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  472. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  473. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  474. 16:14:18.471 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  475. 16:14:18.471 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  476. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  477. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  478. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  479. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  480. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  481. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  482. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  483. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  484. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  485. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  486. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  487. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  488. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  489. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  490. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  491. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  492. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  493. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  494. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  495. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  496. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  497. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  498. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  499. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  500. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  501. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  502. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  503. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  504. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  505. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  506. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  507. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  508. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  509. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  510. 16:14:18.472 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  511. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  512. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  513. 16:14:18.472 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  514. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  515. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  516. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  517. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  518. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  519. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  520. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  521. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  522. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  523. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  524. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  525. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  526. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  527. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  528. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  529. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  530. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  531. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  532. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  533. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  534. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  535. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  536. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  537. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  538. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  539. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  540. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  541. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  542. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  543. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  544. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  545. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  546. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  547. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  548. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  549. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  550. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  551. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  552. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  553. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  554. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  555. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  556. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  557. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  558. 16:14:18.473 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  559. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  560. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  561. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  562. 16:14:18.473 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  563. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  564. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  565. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  566. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  567. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  568. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  569. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  570. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  571. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  572. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  573. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  574. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  575. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  576. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  577. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  578. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  579. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  580. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  581. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  582. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  583. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  584. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  585. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  586. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  587. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  588. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  589. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  590. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  591. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  592. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  593. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  594. 16:14:18.474 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  595. 16:14:18.474 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  596. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  597. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  598. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  599. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  600. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  601. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  602. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  603. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  604. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  605. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  606. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  607. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  608. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  609. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  610. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  611. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  612. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  613. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  614. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  615. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  616. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  617. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  618. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  619. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  620. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  621. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  622. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  623. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  624. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  625. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  626. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  627. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  628. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  629. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  630. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  631. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  632. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  633. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  634. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  635. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  636. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  637. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  638. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  639. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  640. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  641. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  642. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  643. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  644. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  645. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  646. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  647. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  648. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  649. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  650. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  651. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  652. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  653. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  654. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  655. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  656. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  657. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  658. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  659. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  660. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  661. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  662. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  663. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  664. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  665. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  666. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  667. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  668. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  669. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  670. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  671. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  672. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  673. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  674. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  675. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  676. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  677. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  678. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  679. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  680. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  681. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  682. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  683. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  684. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  685. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  686. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  687. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  688. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  689. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  690. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  691. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  692. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  693. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  694. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  695. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  696. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  697. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  698. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  699. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  700. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  701. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  702. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  703. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  704. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  705. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  706. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  707. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  708. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  709. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  710. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  711. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  712. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  713. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  714. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  715. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  716. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  717. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  718. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  719. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  720. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  721. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  722. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  723. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  724. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  725. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  726. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  727. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  728. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  729. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  730. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  731. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  732. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  733. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  734. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  735. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  736. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  737. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  738. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  739. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  740. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  741. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  742. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  743. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  744. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  745. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  746. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  747. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  748. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  749. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  750. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  751. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  752. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  753. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  754. 16:14:18.475 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  755. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  756. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  757. 16:14:18.475 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  758. 16:14:18.476 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  759. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  760. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  761. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  762. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  763. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  764. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  765. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  766. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  767. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  768. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  769. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  770. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  771. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  772. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  773. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  774. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  775. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  776. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  777. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  778. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  779. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  780. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  781. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  782. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  783. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  784. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  785. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  786. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  787. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  788. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  789. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  790. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  791. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  792. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  793. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  794. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  795. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: P操作 -1
  796. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 生产,放入一个对象
  797. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: V操作 +1
  798. 16:14:18.477 [Thread-0] INFO com.boonya.code.pv.Producer - 生产者: 通知消费者,生产者阻塞
  799. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: P操作 -1
  800. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 消费,拿走一个对象
  801. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: V操作 +1
  802. 16:14:18.477 [Thread-1] INFO com.boonya.code.pv.Consumer - 消费者: 通知生产者,消费者阻塞
  803. 16:14:28.445 [main] INFO com.example.test.PVTests - producer: count = 100
  804. 16:14:28.447 [main] INFO com.example.test.PVTests - consumer:count = 100
  805. Disconnected from the target VM, address: '127.0.0.1:63700', transport: 'socket'
  806. Process finished with exit code 0

Java信号量测试

  1. package com.example.test;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.junit.Test;
  4. import java.util.concurrent.Semaphore;
  5. import java.util.concurrent.atomic.AtomicInteger;
  6. /**
  7. * Java Semaphore 信号量测试
  8. * @author Pengjunlin
  9. * @date 2022/3/7
  10. */
  11. @Slf4j
  12. public class SemaphoreTest {
  13. /**
  14. * 非公平信号量
  15. */
  16. Semaphore noFairSemaphore = new Semaphore(5);
  17. /**
  18. * 公平信号量
  19. */
  20. Semaphore fairSemaphore = new Semaphore(5,true);
  21. /**
  22. * 非公平信号量处理加法线程【非公平信号量有多少拿多少,先到先得】
  23. */
  24. private class NoFairAddThread implements Runnable{
  25. int threadIndex = 0;
  26. AtomicInteger count;
  27. public NoFairAddThread(AtomicInteger count,int threadIndex){
  28. this.count = count;
  29. this.threadIndex = threadIndex;
  30. }
  31. @Override
  32. public void run() {
  33. if(noFairSemaphore.tryAcquire(1)){
  34. log.info("-noFairSemaphore--拿到许可---!{}",threadIndex);
  35. count.incrementAndGet();
  36. noFairSemaphore.release();
  37. }else{
  38. log.info("-noFairSemaphore--没有拿到许可---!{}",threadIndex);
  39. }
  40. }
  41. }
  42. /**
  43. * 公平信号量处理加法线程【公平信号量能确保都能获取到】
  44. */
  45. private class FairAddThread implements Runnable{
  46. int threadIndex = 0;
  47. AtomicInteger count;
  48. public FairAddThread(AtomicInteger count,int threadIndex){
  49. this.count = count;
  50. this.threadIndex = threadIndex;
  51. }
  52. @Override
  53. public void run() {
  54. if(fairSemaphore.tryAcquire(1)){
  55. log.info("-fairSemaphore--拿到许可---!{}",threadIndex);
  56. count.incrementAndGet();
  57. fairSemaphore.release();
  58. }
  59. }
  60. }
  61. @Test
  62. public void noFairAddThread(){
  63. AtomicInteger count = new AtomicInteger(0);
  64. for (int i = 0; i < 10; i++) {
  65. new Thread(new NoFairAddThread(count,i)).start();
  66. }
  67. try {
  68. Thread.sleep(1000);
  69. } catch (InterruptedException e) {
  70. e.printStackTrace();
  71. }
  72. log.info("final count = {}",count.get());
  73. }
  74. @Test
  75. public void fairAddThread(){
  76. AtomicInteger count = new AtomicInteger(0);
  77. for (int i = 0; i < 10; i++) {
  78. new Thread(new FairAddThread(count,i)).start();
  79. }
  80. try {
  81. Thread.sleep(1000);
  82. } catch (InterruptedException e) {
  83. e.printStackTrace();
  84. }
  85. log.info("final count = {}",count.get());
  86. }
  87. }

项目地址:daily-code-testing: 日常代码测试,包括编码原则、单元测试,设计模式等。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载