Java 多线程 (PART XVI)生产者消费者(I) 单个生产者单个消费者
2017-10-10 13:59
357 查看
图解:
代码:
package produceandconsume; class ValueObject { //缓冲区 public static String value = ""; } class P { private Object lock; public P(Object lock) { this.lock = lock; } public void setValue() { try { synchronized (lock) { if (!ValueObject.value.equals("")) { //检查缓冲区如果消费者还没有将物品取走则等待 lock.wait(); } //向缓冲区放入物品,并且通知消费者 String value = System.currentTimeMillis() + "_" + System.nanoTime(); System.out.println("set 的值是" + value); ValueObject.value = value; lock.notify(); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } class C { private Object lock; public C(Object lock) { this.lock = lock; } public void getValue() { try { synchronized (lock) { if (ValueObject.value.equals("")) { //检查缓冲区如果生产者还没有生产则等待 lock.wait(); } //取得缓冲区里的值,并且通知生产者 System.out.println("get 的值是" + ValueObject.value); ValueObject.value = ""; lock.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } } } //生产者线程 class ThreadP extends Thread { private P p; public ThreadP(P p) { this.p = p; } @Override public void run() { while (true) { p.setValue(); } } } //消费者线程 class ThreadC extends Thread { private C c; public ThreadC(C c) { this.c = c; } @Override public void run() { while (true) { c.getValue(); } } } public class Main { public static void main(String[] args) { Object lock = new Object(); P p = new P(lock); C c = new C(lock); ThreadP pthread = new ThreadP(p); ThreadC cthread = new ThreadC(c); //启动生产者消费者线程 pthread.start(); cthread.start(); } }
运行结果:
set 的值是1507613938571_6935150933094 get 的值是1507613938571_6935150933094 set 的值是1507613938571_6935150954031 get 的值是1507613938571_6935150954031 set 的值是1507613938571_6935150973736 get 的值是1507613938571_6935150973736 set 的值是1507613938571_6935150993851 get 的值是1507613938571_6935150993851 set 的值是1507613938571_6935151013967 get 的值是1507613938571_6935151013967 set 的值是1507613938571_6935151036135 get 的值是1507613938571_6935151036135 set 的值是1507613938571_6935151056661 get 的值是1507613938571_6935151056661 set 的值是1507613938571_6935151076366 get 的值是1507613938571_6935151076366 set 的值是1507613938571_6935151096071 get 的值是1507613938571_6935151096071
相关文章推荐
- java多线程-消费者和生产者模式
- 手撕代码(三)Java多线程模拟生产者消费者方法
- Java多线程15:Queue、BlockingQueue以及利用BlockingQueue实现生产者/消费者模型
- java多线程之消费者生产者模式
- java多线程—消费者生产者模式
- Java---20---多线程:生产者和消费者2(JDK1.5升级版)
- java例程练习(多线程综合练习[生产者-消费者问题])
- java 多线程 生产者消费者
- Java实践之路——多线程之生产者消费者模型
- Java多线程-并发协作(生产者消费者模型)
- JAVA多线程之——经典面试消费者与生产者
- 基于Java多线程机制的生产者-消费者模型模拟
- Java 技术: 使您轻松地进行多线程应用程序编程——Consumer 类可以简化生产者-消费者行为的实现
- java多线程实现生产者与消费者---经典问题
- Java基础之多线程(二)--通讯、生产者消费者、停止、Jion方法
- Java多线程之并发协作生产者消费者设计模式JDK1.5.0+升级优化版
- java多线程之生产者消费者经典问题
- 【java多线程】【生产者与消费者】【一】
- 多线程编程之生产者消费者(java实现)
- java多线程学习生产者消费者