生产者和消费者
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多线程实现生产者和消费者
编写程序,运用Win32Api实现生产者与消费者使用缓冲区完成生产者与消费者的关系。模拟生产者和消费者的处理过程,程序中演示同步与互斥的关系。
springboot整合kafka实现生产者和消费者,该项目用于小白学习,导入idea连上自己的kafka即可使用
使用信号量实现有限缓冲区的生产者和消费者问题 使用信号量实现读进程具有优先权的读者和写者问题
Qt5多线程,使用QSemaphore类实现生产者和消费者问题。
java IBM MQ 7.5.0 生产者和消费者实例
(1)掌握基本的同步互斥算法,理解生产者和消费者同步的问题模型。 (2)了解Windows 2000/XP中多线程的并发执行机制,线程间的同步和互斥。 (3)学习使用Windows2000/XP中基本的同步对象,掌握相应的API。 2、...
生产者和消费者问题以及哲学家就餐问题,JAVA实现的程序.rar产者和消费者问题以及哲学家就餐问题,JAVA实现的程序.rar
模拟PV操作同步机构,且用PV操作解决生产者——消费者问题。
(2)信号量机制实现生产者和消费者对缓冲区的互斥访问。 (3)生产者生产产品时,要输出当前缓冲区冲产品的个数和存放产品的位置。 (4)消费者消费产品时,要输出当前缓冲区冲产品的个数和消费产品的位置。 (5)...
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
使用idea工具,使用mven编译工具,kafka的生产者和消费者的java版本的实现。
1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者进程的标识符。 说明:有界缓冲区(提示:有界缓冲区可用数组实现)内设有20个存储单元,放入/取出的数据...
使用多线程实现了生产者和消费者模式
使用信号量实现有限缓冲区的生产者和消费者问题 使用信号量实现读进程具有优先权的读者和写者问题 实验报告(内容、环境、遇到的问题及解决、源代码、流程图、总结) 源代码
实验一 生产者和消费者问题 因为源码比较长,所以想在网上找现成的,不想自己写,结果找了好久,发现:第一,《操作系统实验指导》基本上找不到电子版的;第二,这个实验的源码也很难找(反正我是没找到,好不容易...