`
vvggsky
  • 浏览: 65557 次
  • 性别: 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

    用进程同步方法解决“生产者-消费者”问题,C或C++语言实现。 1、设计目的 通过研究进程并发和信号量机制,实现生产者-消费者问题的并发控制。 2、设计要求 1)每个生产者和消费者对有界缓冲区进行操作后,即时显示...

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

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

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

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

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

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

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

    这是一个操作系统的课程设计 ,关于在linux下用多进程同步方法解决生产者-消费者问题。 有论文和源码

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

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

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

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

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

    模拟仿真“生产者-消费者”问题的解决过程及方法,能够用比较形象的方式来表达出生产者—消费者之间的关系。

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

    生产者-消费者问题描述的是:有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费。为使生产者进程与消费者进程能够并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品...

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

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

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

    1.每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者/消费者线程的标识符; 2.生产者和消费者各有两个以上; 3.多个生产者或多个消费者之间须共享对缓冲区进行...

    生产者-消费者模型模拟进程调度

    内含多个实验文档与可运行的代码 ...1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10次。

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

    这是一个在linux系统下用多进程同步的方法解决消费者-生产者问题的源代码,是关于操作系统的。

    生产者-消费者问题.cpp

    一组生产者进程生产产品给一组消费者进程消费。一个有n个缓冲区的缓冲池,生产者一次向一个缓冲区中投入消息,消费者从一个缓冲区中取得。生产者——消费者问题实际上是相互合作进程关系的一种抽象。该类问题不允许...

    操作系统课设用多进程同步方法演示“生产者-消费者”问题

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

    用信号量解决生产者-消费者问题.zip

    在 Ubuntu 下编写程序,用信号量解决生产者-消费者问题 在 Ubuntu 下编写应用程序 pc.c,解决经典的生产者-消费者问题,完成下面的功能: 建立一个生产者进程,N 个消费者进程(N &gt; 1) 用文件建立一个共享缓冲区 生产...

    多线程同步方法解决生产者-消费者问题(linux线程实现)

    设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...

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

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

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

    多进程同步方法演示“生产者-消费者”问题,操作系统OS的课程设计,附带报告

    生产者消费者问题

    生产者消费者问题,C++。生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区。其中一个是生产者,用于将消息放入缓冲区;另外一个是消费者...

Global site tag (gtag.js) - Google Analytics