`
砺雪凝霜
  • 浏览: 155519 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

生产者和消费者

阅读更多

                                                     生产者和消费者

 java 1.5以后用
1. lock.lock()
      同步代码
     lock.unlock()
替代了synchronized同步代码块
2.condition.await()替代了wait();
3.condition.signal替代了notify
4.condition.signalAll()替代了notifyAll

public class ProducersAndConsumer {

 /**
  * @param args
  */
 public static void main(String[] args) {
  Resource re = new Resource(1);
  new Thread(new Producer(re)).start();//t1
  new Thread(new Producer(re)).start();//t2
  new Thread(new Consumer(re)).start();//t3
  new Thread(new Consumer(re)).start();//t4

 }

}

class Resource {
 private String name;
 private int count;
 boolean flag;

 public Resource(int count) {
  this.count = count;
 }

 /*
  * t1等待 t2在等待 t3没启动 t4没启动
  * t3启动 t1唤醒 t2在等待 t4没启动
  * t3等待 t1唤醒 t2在等待 t4等待
  * t1启动 t2被唤醒 t3在等待 t4等待
  *  此时t2不会判断标志位就往下执行了,导致生产了多次,只消费了1次的情况

  * 所以我加了一个while循环来防止这种问题的发生

  */
 private Lock lock = new ReentrantLock();
 private Condition condition = lock.newCondition();

 public void set(String name) {
  lock.lock();
  try {
   while (flag) {
      condition.await();  // java1.5以前的写法this.wait();
   }
   this.name = name + "---" + count++;
   flag = true;
   System.out.println(Thread.currentThread().getName()
     + ".....生产了ipnone" + count);
        condition.signalAll(); //java1.5以前的写法: this.notifyAll();
  } catch (InterruptedException e) {
   e.printStackTrace();
  } finally {
   lock.unlock();
  }
 }

 public void out() {
  lock.lock();
  try {
   while (!flag) {
    condition.await();// java1.5以前的写法 this.wait();
   }
   System.out.println(Thread.currentThread().getName()
     + "----消费了iphone" + count);
   condition.signalAll();// java1.5以前的写法 this.notifyAll();
   flag = false;
  } catch (InterruptedException e) {
   e.printStackTrace();
  }finally{
   lock.unlock();
  }
 }
}

class Producer implements Runnable {
 private Resource res;

 public Producer(Resource res) {
  this.res = res;
 }

 @Override
 public void run() {
  while (true) {
   res.set("iphone");
  }
 }

}

class Consumer implements Runnable {
 private Resource res;

 public Consumer(Resource res) {
  this.res = res;
 }

 @Override
 public void run() {
  while (true) {
   res.out();
  }
 }

}

分享到:
评论

相关推荐

    操作系统课程设计生产者和消费者问题源代码

    (1)创建生产者和消费者线程 在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。 该文件的格式和含义如下: 3 1 ...

    java多线程实现生产者和消费者

    生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...

    12.2 Qt5多线程:使用信号量实现生产者和消费者

    6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...

    使用信号量实现有限缓冲区的生产者和消费者问题

    "生产者消费者问题"和"读写者问题"是经典的并发控制问题,通过使用信号量机制可以有效地解决这些问题。下面将详细阐述这两个问题以及如何在Linux环境下用C语言实现。 首先,我们来看“生产者消费者问题”。这个问题...

    生产者和消费者问题以及哲学家就餐问题,JAVA实现的程序.rar

    在"生产者和消费者问题.txt"文件中,可能包含了使用`BlockingQueue`实现生产者消费者问题的Java代码示例,包括如何创建队列,以及生产者和消费者线程如何交互。而"哲学家就餐问题.txt"文件可能展示了如何用Java的...

    操作系统上机实验报告 进程同步和通信-生产者和消费者问题模拟

    ### 操作系统上机实验报告:进程同步和通信——生产者和消费者问题模拟 #### 一、实验目的 本次实验的主要目的是让学生通过调试、修改、运行一个模拟程序,加深对进程概念的理解,熟悉同步和通信的过程,掌握进程...

    java IBM MQ 7.5.0 生产者和消费者实例

    在这个“java IBM MQ 7.5.0 生产者和消费者实例”中,我们将探讨如何使用Java编程语言与IBM MQ 7.5.0版本进行交互,创建生产者和消费者应用。 1. **IBM MQ安装与配置**: 在开始编程之前,首先需要在本地或服务器...

    操作系统 生产者和消费者问题

    生产者和消费者问题是这样的:想象有一个缓冲区,生产者线程负责生产产品并放入缓冲区,而消费者线程则负责从缓冲区取出并消费产品。问题的核心在于,当缓冲区满时,生产者必须等待消费者消费一部分产品才能继续生产...

    C语言编程模拟生产者和消费者问题.pdf

    生产者负责生产产品,而消费者负责消费产品。生产者和消费者之间需要同步,以避免冲突。使用PV操作同步机构可以实现生产者和消费者之间的同步。 在实验中,需要模拟生产者和消费者的并发执行,并使用PV操作来实现...

    jchc.rar_tearshmj_生产者_生产者-消费者问题 c++ _生产者和消费者_生产者消费者

    《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...

    生产者和消费者模式多线程

    创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....

    使用信号量实现有限缓冲区的生产者和消费者问题及读进程具有优先权的读者和写者问题

    5. 在生产者和消费者完成操作后,通过V操作增加count,唤醒可能被阻塞的进程。 接下来是读进程具有优先权的读者-写者问题。在此问题中,多个读者可以同时读取数据,但只有一个写者可以修改数据,且写者在写入时不能...

    java模拟生产者和消费者问题

    代码中包含了多个按钮(代表生产者和消费者),以及文本字段用于显示队列状态。尽管代码未完整展示逻辑部分,但可以看出其意图是通过按钮点击事件来模拟生产者生产数据和消费者消费数据的过程,从而可视化地演示阻塞...

    Kafka中生产者和消费者java实现

    在Kafka中,生产者负责生成消息并将其发布到主题(topics),而消费者则订阅这些主题并消费其中的消息。本篇文章将深入探讨如何在Java环境中使用IDEA,通过Maven构建工具来实现Kafka的生产者和消费者。 首先,我们...

Global site tag (gtag.js) - Google Analytics