OS 多个生产者--消费者间线程通信

class ProducerConsumeerDemo
{
    public static void main(String[] args)
    {
        Resource r = new Resource();
        Producer pro = new Producer(r);
        Consumer con = new Consumer(r);     Producer pro2 = new Producer(r);      Consumer con2 = new Consumer(r);

        Thread t1 = new Thread(pro);
        Thread t2 = new Thread(pro2);     Thread t3 = new Thread(con);     Thread t4 = new Thread(con2);

        t1.start();
        t2.start();
        //System.out.println();
    }
}

class Resource
{
    private String name;
    private int count =1 ;
    private boolean flag = false;

    public synchronized void set(String name)
    {
        while(flag)
            try{wait();} catch(Exception e){}
        this.name = name + "---" + count++;

        System.out.println(Thread.currentThread().getName()+ "--111----Producer" +this.name);
        flag = true;
        this.notifyAll();

    }

    public synchronized void out()
    {
        while(!flag)
            try{wait();} catch(Exception e){}
        System.out.println(Thread.currentThread().getName()+ "--222--Consumer"+this.name);
        flag = false;
        this.notifyAll();//this指的是资源对象,锁即资源
    }
}

class Producer implements Runnable
{
    private Resource res;

    Producer(Resource res)
    {
        this.res =  res;
    }
    public void run()
    {
        while(true)
            res.set("+33");
    }
}

class Consumer implements Runnable
{
    private Resource res;

    Consumer(Resource res)
    {
        this.res =  res;
    }
    public void run()
    {
        while(true)
            res.out();
    }
}

t1 t3 ---生产者

t2 t4 ---消费者

针对notify();

当t1生产一个产品后,flag判断完之后 wait一下 (释放锁,cpu) 接着t2 t3 t4 抢夺cpu 如,t2抢到后 也wait了  内存池(存放同一个锁的等待线程)t1 ---> t2

到了t3 消费了一个唤醒了t1 ,t3进入内存池,t4抢到cpu ,也wait了,进入内存池,t1执行,唤醒t2,t2执行,这样产生了生产两个产品,但是第一个被第二个覆盖了。出现ERROR

针对notifyAll()

当t1生产一个产品后,flag判断完之后 wait一下 (释放锁,cpu) 接着t2 t3 t4 抢夺cpu 如,t2抢到后 也wait了  内存池(存放同一个锁的等待线程)t1 ---> t2

到了t3 消费了一个唤醒了所有线程 ,t3进入内存池,t4抢到cpu ,也wait了,进入内存池,t1执行,唤醒所有线程。

时间: 2024-08-05 07:09:27

OS 多个生产者--消费者间线程通信的相关文章

从生产者消费者窥探线程同步(上)

欢迎转载,转载请注明出处.尊重他人的一丢丢努力,谢谢啦! 阅读本篇之后,如果你觉得说得还有点道理,那不妨先戳一下从生产者消费者窥探线程同步(下) ,两篇一起嚼才更好呢. 最近复习了下生产者消费者模式,虽然对它不太陌生,但要说认认真真地实现,还真从来没有过,这里将它总结一下,有不妥或者见识不到之处,欢迎留言指出. 为什么要使用 大概基于以下2点: (1)可以实现解耦 大多数设计模式,都会创造出一个第三者来担任解耦角色.比如末班模式的模板类,工厂模式的工厂类等.而消费者观察者模式则是使用拥塞队列来给

从生产者消费者窥探线程同步(下)

欢迎转载,转载请注明出处.尊重他人的一丢丢努力,谢谢啦! 阅读本篇之前,如果你还没有看过从生产者消费者窥探线程同步(上) ,那不妨先戳一下,两篇一起嚼才更好呢. 上一篇分析了使用BlockQueue和synchronized来实现生产者消费者模式.这一篇来看一下其他的实现,闲言少叙. (3)Lock实现 核心:Lock的用法中规中矩,有点类似于非静态同步方法,只是前者是对lock对象显式加锁,而后者是对当前对象隐式加锁. 我相信大多数人在第一次接触Lock锁的时候,内心都会有这样的疑惑:明明提供

进程,互斥锁,生产者消费者,线程

进程,互斥锁,生产者消费者,线程 一.僵尸进程与孤儿进程 代码演示 ''' 僵尸进程(有坏处): - 在子进程结束后,主进程没有正常结束,子进程的PID不会被回收. 缺点: - 操作系统中PID号是有限的,比如子进程PID号无法正常回收,则会占用PID号. - 资源浪费 - 若PID号满了,则无法创建新的进程. 孤儿进程(没有坏处): - 在子进程没有结束时,主进程没有"正常结束",子进程PID不会被回收. - 操作系统优化机制(孤儿院): 当主进程意外终止,操作系统会检测是否有正在运

c++11 条件变量 生产者-消费者 并发线程

http://baptiste-wicht.com/posts/2012/04/c11-concurrency-tutorial-advanced-locking-and-condition-variables.html ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 struc

生产者消费者模型 线程池

1.生产者消费者模型 主要是为解耦 借助队列来实现生产者消费这模型 栈:先进后出(First In Last Out 简称:FILO) 队列:先进先出(FIFO) import queue from multiprocessing import Queue 借助Queue解决生产者消费这模型队列是安全的 q=Queue(m) q = Queue(num) num : 队列的最大长度 q.get()# 阻塞等待获取数据,如果有数据直接获取,如果没有数据,阻塞等待 q.put()# 阻塞,如果可以继

Operating System Concepts 项目:生产者-消费者问题 线程

一. 实验目的 实现一个c程序,该程序能模拟解决有限缓冲问题,其中消费者和生产者产生和消耗随机数 二.实验内容 缓冲区 元数据类型为buffer_item,大小为1000的数组,按环形队列处理 生产者和消费者线程 生产者不断执行如下两个操作:消费一个随机数,生产两个随机数 消费者不断执行如下两个操作:生产一个随机数,消费两个随机数 3.Pthead线程创建 使用pthread_create创建5个生产者线程,5个消费者线程,主程序等待所有线程退出 三. 实验环境 Ubuntu Gnome 14.

Java线程与并发编程实践----等待通知(生产者消费者问题)线程

Java提供了一套API来支持线程之间的交互.在Object类中提供了一套等待通知的API  wait()     notify()     notifyAll()     此处要注意的是,绝不要在循环外面调用wait()方法.(单独开一片文章来讨论)     下面使用消费者与生产者问题来展示以上API的使用: package xiancheng; public class PC { public static void main(String[] args) { Shared s = new 

阿里巴巴java研发2015实习笔试题--生产者消费者并发线程安全

import java.util.ArrayList;import java.util.List;/** * 箱子最多装5个苹果.一个人往里放,一个人往外拿.苹果无限. * @author Administrator */public class test01 { public static void main(String[] args) { // 共享资源 Production pro = new Production(); Custom custom = new Custom(pro);

Java多线程-同步:synchronized 和线程通信:生产者消费者模式

大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同步:synchronized 多个线程同时访问一个对象,可能造成非线程安全,数据可能错误,所谓同步:就是控制多个线程同时访就是控制多线程操作同一个对象时,注意是同一个对象,数据的准确性, 确保数据安全,但是加入同步后因为需要等待,所以效率相对低下. 如:一个苹果,自己一个人去咬怎么都不会出问题,但是