生产者/消费者:没有生产者/消费者应该阻止其他生产者/消费者

时间:2015-04-30 12:25:33

标签: java algorithm data-structures software-design

我正在设计一个系统,其中有m个生产者和from Quartz import CGWindowListCopyWindowInfo, kCGNullWindowID, kCGWindowListOptionAll import datetime, time print datetime.datetime.now() found = False count = 0 windowName = "Hello World" while 1: list = CGWindowListCopyWindowInfo(kCGWindowListOptionAll, kCGNullWindowID) time.sleep(0.2) for a in list: try: if a['kCGWindowName'] == windowName: print "**** yippee *****" print "window found" print a found = True break except: pass if found == True: break print "NOT FOUND", count count+=1 print datetime.datetime.now() 个消费者,其中n和m是数字,n!= m。

我想以这样的方式设计系统,

  1. 制作
  2. 时,制片人不应阻止其他制片人
  3. 任何消费者都不应该在消费时阻止其他消费者
  4. 生产者或消费者在生产/消费时相互阻止
  5. 例如:在java中,如果我使用同步关键字,那么它将阻止相应的调用者。

    我不确定应该使用什么数据结构和算法来实现这个系统。

    有人能为我提供帮助/指示吗?

4 个答案:

答案 0 :(得分:2)

你可能想要像ConcurrentLinkedQueue这样的东西。这个想法是你创建一个队列。 n个生成器中的每一个都将工作项添加到队列中,每个m个使用者从队列中读取工作项。制片人只是:

while not done
    create work item
    add work item to queue

消费者就是这么简单:

while not done
    get next work item from queue
    process work item

ConcurrentLinkedQueue方法处理添加和删除项目,根据需要与其他生产者和消费者同步。

唯一真正的缺点是你必须轮询队列以查看是否有项目。因此,您可能希望每当项目添加到队列时都会触发自动重置事件。例如:

add work item to queue
set ItemAvailable event

消费者会轮询队列,如果没有可用的项目,请等待事件:

while not done
    while ((item = queue.poll) == null)
        wait on ItemAvailable event
    process item

看看我链接的示例。这真的不难用。

答案 1 :(得分:1)

根据你需要做多少繁重的工作,以及你的解决方案需要扩展的程度,RxJava有一个陡峭的学习曲线,但是一旦你超越了它,它可能是最优雅,扩展和执行解决方案。

在不同的线程中运行所有生成器,将它们与Merg()组合,将消费者移动到具有.observeOn(Scheduler.newThread())的未绑定缓冲区上的自己的线程。

如果您需要在多个系统上并行运行的内容,请查看mapreduce

如果您需要完整光谱的另一端(简单),只需坚持ConcurrentQueue即可。这并不支持多播,但至少解决了生产者方面的问题。

答案 2 :(得分:0)

你想要一种方法,其中每个动作都是原子的和不可中断的,所以是的,在我看来,最好的方法是在方法上使用synchronized modifier来设置锁。

另一个有趣的方法是使用原子变量 - > http://baptiste-wicht.com/posts/2010/09/java-concurrency-atomic-variables.html

这取决于您在这些生产者/消费者结构中的数据。

答案 3 :(得分:0)

使用wait()和notify()进行线程通信,你可以创建n生成器和m消费者线程

class Q{

 int n;

 boolean value=false;

 synchronized int get() {

 if(!value)

 try  {  wait();   }

 catch(InterruptedException e)

 { System.out.println("thread interrupted"); }

 System.out.println("Got : "+n);

 value=false;

 notify();

 return n;}

 synchronized void put(int n) {

 if(value)

 try { wait();}

 catch(InterruptedException e)

 {  System.out.println("thread interrupted"); }

 this.n=n;

 value=true;

 System.out.println("Put : "+n);

 notify();}}

 class Producer implements Runnable{

 Q q;

 Producer(Q q){

 this.q=q;

  new Thread(this,"Producer").start();}

 public void run(){

 int i=0;

 while(true)

 {

 q.put(i++);}}

 }

 class Consumer implements Runnable{

 Q q;

  Consumer(Q q) {

  this.q=q;

  new Thread(this,"Consumer").start();}

  public void run(){

   while(true)

  {

  q.get();

   }}}

   class PCFixed

  {

   public static void main(String ar[])

  {

   Q q=new Q();

   new Producer(q);

   new Consumer(q);

   System.out.println("PRESS CONTROL-C TO STOP");

   }

   }

它会变为无穷大,根据您的要求进行更改