`
vvggsky
  • 浏览: 66925 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

生产者-消费者

    博客分类:
  • J2SE
阅读更多
package debug;
import java.util.regex.*;
import java.util.*;


class Food{}

class Table extends LinkedList{
  int maxSize;
  public Table(int maxSize){
    this.maxSize = maxSize;
  }
  public synchronized void putFood(Food f){
    while(this.size() >= this.maxSize){
      try{
        this.wait();
      }catch(Exception e){}
    }
    this.add(f);
    notifyAll();
  }
  
  public synchronized Food getFood(){
    while(this.size() <= 0){
      try{
        this.wait();
      }catch(Exception e){}
    }
    Food f = (Food)this.removeFirst();
    notifyAll();
    return f;
  }
}


class Chef extends Thread{
  Table t;
  String name;
  Random r = new Random(12345);
  public Chef(String name,Table t){
    this.t = t;
    this.name = name;
  }
  public void run(){
    while(true){
      Food f = make();
      System.out.println(name+" put a Food:"+f);
      t.putFood(f);
    }
  }
  private Food make(){
    try{
      Thread.sleep(200+r.nextInt(200));
    }catch(Exception e){}
    return new Food();
  }
}

class Eater extends Thread{
  Table t;
  String name;
  Random r = new Random(54321);
  public Eater(String name,Table t){
    this.t = t;
    this.name = name;
  }
  public void run(){
    while(true){
      Food f = t.getFood();
      System.out.println(name+" get a Food:"+f);
      eat(f);
      
    }
  }
  private void eat(Food f){
    
    try{
      Thread.sleep(400+r.nextInt(200));
    }catch(Exception e){}
  }
}

public class Test {
    public static void main(String[] args) throws Exception{
      Table t = new Table(10);
      new Chef("Chef1",t).start();
      new Chef("Chef2",t).start();
      new Chef("Chef3",t).start();
      new Chef("Chef4",t).start();
      new Eater("Eater1",t).start();
      new Eater("Eater2",t).start();
      new Eater("Eater3",t).start();
      new Eater("Eater4",t).start();
      new Eater("Eater5",t).start();
      new Eater("Eater6",t).start();

    }
}



class Producer implements Runnable {

   private final BlockingQueue queue;

   Producer(BlockingQueue q) { queue = q; }

   public void run() {

     try {

       while(true) { queue.put(produce()); }

     } catch (InterruptedException ex) { ... handle ...}

   }
   Object produce() { ... }
 }

 class Consumer implements Runnable {

   private final BlockingQueue queue;

   Consumer(BlockingQueue q) { queue = q; }

   public void run() {

     try {

       while(true) { consume(queue.take()); }

     } catch (InterruptedException ex) { ... handle ...}

   }

   void consume(Object x) { ... }

 }

 class Setup {

   void main() {

     BlockingQueue q = new SomeQueueImplementation();

     Producer p = new Producer(q);

     Consumer c1 = new Consumer(q);

     Consumer c2 = new Consumer(q);

     new Thread(p).start();

     new Thread(c1).start();

     new Thread(c2).start();
   }

 }


   1. import java.util.concurrent.locks.Condition;  
   2. import java.util.concurrent.locks.Lock;  
   3. import java.util.concurrent.locks.ReentrantLock;  
   4.   
   5. public class BoundedBuffer<T> {  
   6.     //  
   7.     private int head;  
   8.     private int tail;  
   9.     private int count;  
  10.     private final T buffer[];  
  11.       
  12.     //  
  13.     private final Lock lock = new ReentrantLock();  
  14.     private final Condition notEmpty = lock.newCondition();  
  15.     private final Condition notFull = lock.newCondition();  
  16.       
  17.     @SuppressWarnings("unchecked")  
  18.     public BoundedBuffer(int capacity) {  
  19.         this.buffer = (T[]) new Object[capacity];  
  20.     }  
  21.       
  22.     public T take() throws InterruptedException {  
  23.         lock.lock();  
  24.         try {  
  25.             while(isEmpty()) {  
  26.                 notEmpty.await();  
  27.             }  
  28.               
  29.             T t = doTake();  
  30.               
  31.             notFull.signal();  
  32.               
  33.             return t;  
  34.         } finally {  
  35.             lock.unlock();  
  36.         }  
  37.     }  
  38.   
  39.     public void put(T t) throws InterruptedException {  
  40.         lock.lock();  
  41.         try {  
  42.             while(isFull()) {  
  43.                 notFull.await();  
  44.             }  
  45.               
  46.             doPut(t);  
  47.               
  48.             notEmpty.signal();  
  49.         } finally {  
  50.             lock.unlock();  
  51.         }  
  52.     }  
  53.       
  54.     private boolean isEmpty() {  
  55.         return count == 0;  
  56.     }  
  57.       
  58.     private boolean isFull() {  
  59.         return count == buffer.length;  
  60.     }  
  61.       
  62.     private T doTake() {  
  63.         T t = buffer[head];  
  64.         buffer[head] = null;  
  65.         if(++head == buffer.length) {  
  66.             head = 0;  
  67.         }  
  68.         --count;  
  69.         return t;  
  70.     }  
  71.   
  72.     private void doPut(T t) {  
  73.         buffer[tail] = t;  
  74.         if(++tail == buffer.length) {  
  75.             tail = 0;  
  76.         }  
  77.         ++count;  
  78.     }  
  79. }  
分享到:
评论

相关推荐

    利用记录型信号量解决生产者-消费者问题.doc

    记录型信号量通常用于解决生产者-消费者问题,因为它可以记录缓冲池中的空缓冲区和满缓冲区的数量,从而实现生产者和消费者的同步。 解决生产者-消费者问题的方法 为了解决生产者-消费者问题,我们可以使用记录型...

    用多线程同步方法解决生产者-消费者问题(操作系统课设

    生产者-消费者问题是操作系统中经典的问题之一,它是指在多线程环境下,多个生产者线程和消费者线程访问同一个共享缓冲区,导致缓冲区的数据混乱和不一致的问题。 在解决生产者-消费者问题时,需要使用同步机制来...

    用多进程同步方法解决生产者-消费者问题

    在生产者-消费者问题中,可以使用互斥量(mutex)保证缓冲区的独占访问,以及使用条件变量(condition variable)实现生产者等待消费者消费或消费者等待生产者生产。 4. **互斥量**:互斥量用于实现对共享资源的...

    用多进程同步方法演示“生产者-消费者”问题

    1、设计目的:通过研究Linux的进程机制和信号量,实现生产者消费者问题的并发控制。 2、说明:有界缓冲区内设有20个存储单元,放入取出的产品设定为1-20个整数。 3、设计要求: 生产者和消费者进程的数目不固定,可...

    生产者-消费者问题的模拟实现(课设含源代码).doc

    生产者-消费者问题是操作系统中经典的进程同步问题,它模拟了实际生产环境中的资源分配与消耗。在这个问题中,生产者进程负责生成数据并放入有限大小的缓冲区,而消费者进程则从缓冲区取出数据进行消费。为了确保...

    linux下用多进程同步方法解决生产者-消费者问题源代码

    生产者-消费者模型通常包括两个角色:生产者进程负责生成数据,而消费者进程则负责消费这些数据。在一个共同的数据缓冲区中,生产者将产品放入,消费者从中取出。关键在于,当缓冲区满时,生产者应停止生产直到消费...

    模拟“生产者-消费者”解决过程及方法

    "生产者-消费者"问题是一种经典的多线程同步问题,源于计算机科学中的操作系统领域,用于描述在并发环境中如何协调生产者和消费者之间的操作,确保数据的一致性和避免资源浪费。这个问题的基本设定是有一个共享缓冲...

    用多线程同步方法解决生产者-消费者问题

    生产者-消费者问题是这种并发模型的一个经典案例,它涉及到如何在多个线程间共享资源,确保数据的一致性和正确性。在这个场景中,生产者线程负责生成数据并放入一个有限的缓冲区,而消费者线程则负责从缓冲区取出...

    利用记录型信号量解决生产者-消费者问题

    1.利用记录型信号量解决生产者-消费者问题.odt1.利用记录型信号量解决生产者-消费者问题.odt1.利用记录型信号量解决生产者-消费者问题.odt

    操作系统之Linux下的生产者-消费者模型

    结合System V信号量机制,利用Linux下的多线程库实现了Linux下的操作系统生产者-消费者模型,具体原理可参考博文:: http://blog.csdn.net/Mikeoperfect/article/details/79431642

    多进程同步方法演示“生产者-消费者”问题_操作系统OS_带报告

    "生产者-消费者"问题描述的是两个或多个进程之间的协作:生产者进程负责生成数据(产品),而消费者进程则负责消耗这些数据。为了确保系统的稳定性和正确性,必须防止生产者过快地生产数据导致缓冲区溢出,或者消费...

    以记录型信号量实现生产者-消费者问题

    以记录型信号量实现生产者-消费者问题 实验目的: 1.加深对进程同步概念的理解。 2.理解多道程序环境中,不同进程对资源访问及相互合作进程的关系的处理方法。 实验要求: 利用C语言程序模拟生产者-消费者问题和哲学...

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

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

    用多线程同步方法解决生产者-消费者问题(操作系统课设)

    ### 生产者-消费者问题详解 #### 一、问题背景与意义 生产者-消费者问题,作为操作系统领域经典的同步问题之一,广泛应用于多线程环境下资源共享的场景。它描述了一个或多个人(生产者)向一个有限容量的缓冲区中...

    编程模拟实现生产者-消费者进程

    在生产者-消费者问题中,需要确保消费者不会从空缓冲区中读取数据,同时生产者也不会向满缓冲区写入数据。 - **互斥**:指同一时间内只有一个进程可以访问某个资源或执行某段代码。在本例中,有界缓冲区作为一个...

    生产者-消费者的Linux多线程实现.pdf

    生产者-消费者问题是在有界缓冲上操作的,它利用 N 个字节的共享内存作为有界循环缓冲区,生产者线程不断顺序地将 0 到 100 的数字写入共享的循环缓冲区,同时消费者线程不断地从共享的循环缓冲区读取数据。...

    操纵系统课程设计生产者-消费者

    - 在生产者-消费者问题中,对缓冲区的读写操作需要互斥锁来保护,确保在任一时刻,只允许一个线程(生产者或消费者)操作缓冲区。 5. **信号量**: - 信号量是另一种同步机制,它可以表示和控制资源的数量。 - ...

    生产者-消费者多线程处理

    生产者-消费者模型涉及到两个主要角色:生产者(Producer)和消费者(Consumer)。生产者负责生成数据或产品,并将其放入一个共享的缓冲区;而消费者则从这个缓冲区中取出并消费这些数据或产品。在我们的例子中,有...

    pandc.rar_生产控制系统_生产者与消费者_生产者-消费者问题

    生产者-消费者问题的基本情景是这样的:一个系统中有两个角色,即生产者和消费者。生产者负责生成数据,而消费者则负责处理这些数据。在实际应用中,这可能意味着生产者在内存中创建数据结构(如队列),然后消费者...

Global site tag (gtag.js) - Google Analytics