生产者和消费者
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 ...
生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...
6. **线程间的通信**:在生产者和消费者之间,可能还需要额外的信号和槽(signal and slot)来协调他们的操作,比如当缓冲区满时通知生产者停止生产,或者当缓冲区空时通知消费者暂停消费。 通过以上步骤,我们可以...
"生产者消费者问题"和"读写者问题"是经典的并发控制问题,通过使用信号量机制可以有效地解决这些问题。下面将详细阐述这两个问题以及如何在Linux环境下用C语言实现。 首先,我们来看“生产者消费者问题”。这个问题...
在"生产者和消费者问题.txt"文件中,可能包含了使用`BlockingQueue`实现生产者消费者问题的Java代码示例,包括如何创建队列,以及生产者和消费者线程如何交互。而"哲学家就餐问题.txt"文件可能展示了如何用Java的...
### 操作系统上机实验报告:进程同步和通信——生产者和消费者问题模拟 #### 一、实验目的 本次实验的主要目的是让学生通过调试、修改、运行一个模拟程序,加深对进程概念的理解,熟悉同步和通信的过程,掌握进程...
在这个“java IBM MQ 7.5.0 生产者和消费者实例”中,我们将探讨如何使用Java编程语言与IBM MQ 7.5.0版本进行交互,创建生产者和消费者应用。 1. **IBM MQ安装与配置**: 在开始编程之前,首先需要在本地或服务器...
生产者和消费者问题是这样的:想象有一个缓冲区,生产者线程负责生产产品并放入缓冲区,而消费者线程则负责从缓冲区取出并消费产品。问题的核心在于,当缓冲区满时,生产者必须等待消费者消费一部分产品才能继续生产...
生产者负责生产产品,而消费者负责消费产品。生产者和消费者之间需要同步,以避免冲突。使用PV操作同步机构可以实现生产者和消费者之间的同步。 在实验中,需要模拟生产者和消费者的并发执行,并使用PV操作来实现...
《生产者-消费者问题在C++中的实现》 生产者-消费者问题是多线程编程中的经典案例,它展示了如何在并发环境中实现线程间的同步与互斥。在本项目中,我们将探讨这个问题,并以C++语言为基础,创建一个在Windows 2000...
创建一个简单的生产者消费者模型,可以使用以下伪代码: ```java class Producer implements Runnable { private final BlockingQueue<String> queue; public Producer(BlockingQueue<String> queue) { this....
5. 在生产者和消费者完成操作后,通过V操作增加count,唤醒可能被阻塞的进程。 接下来是读进程具有优先权的读者-写者问题。在此问题中,多个读者可以同时读取数据,但只有一个写者可以修改数据,且写者在写入时不能...
在Kafka中,生产者负责生成消息并将其发布到主题(topics),而消费者则订阅这些主题并消费其中的消息。本篇文章将深入探讨如何在Java环境中使用IDEA,通过Maven构建工具来实现Kafka的生产者和消费者。 首先,我们...
生产者消费者问题解决方案 生产者消费者问题是计算机科学中的一种经典问题,...该解决方案提供了一个完整的生产者消费者问题的解决方案,使用信号量机制来实现线程之间的同步,解决了生产者和消费者之间的协作问题。