2012-08-10 86 views
0

我有一个java.util.BlockingQueue这是POJOs的需要由ExecutorService服务。该队列必须由单个线程提供服务,但会一次从多个线程推送。Mullti生产者单消费者执行者服务设计

在过去,我已经写了我的解决方案看起来有点像,但我真的很鄙视它:

executorService.execute(new Runnable() { 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       POJO job = blockingQueue.take(); 
       servicePOJO(job); 
      } catch (InterruptedException e) { 
       break; 
      } 
     } 
    } 
}); 

有没有写这更好的办法,或这是最佳方式正在做?我不喜欢这样做的原因是因为如果我需要添加多个消费者,我需要在实际线程池的大小的循环中运行上面的代码。

+0

你为什么不简单地使用单线程执行程序? – sarcan 2012-08-10 23:50:41

+0

这里不清楚'ExecutorService'的意义,除了看起来你没有创建一个专门服务这个队列的线程。你当然是在窃取一个线程来执行这个操作,并且它不符合'ExecutorService'的预期用法。另外,当你通过调用Thread.currentThread()。interrupt()'传播中断时,你在这里吞下'InterruptedException'。 – seh 2012-08-11 00:26:09

回答

0

我会使用ExecutorService每个对象的任务。

public <POJO> void asyncServicePOJO(final POJO pojo) { 
    executorService.execute(new Runnable() { 
     @Override 
     public void run() { 
      servicePOJO(pojo); 
     } 
    }); 
} 

不需要额外的队列。