2012-08-10 2 views
0

У меня есть java.util.BlockingQueue, который полон POJO, который должен обслуживаться 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

+0

Непонятно, что здесь находится здесь «ExecutorService», за исключением того, что кажется, что вы не создаете поток, посвященный обслуживанию этой очереди. Вы, конечно же, * воруете * поток для этого, и это не соответствует ожидаемому использованию «ExecutorService». Кроме того, вы глотаете «InterruptedException» здесь, когда вы должны распространять прерывание, вызывая 'Thread.currentThread(). Interrupt()'. – seh

ответ

0

Я бы использовал ExecutorService с заданием на объект.

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

Нет необходимости в дополнительной очереди.