У меня есть 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;
}
}
}
});
Есть ли лучший способ написания этого, или это оптимальный способ Делать это? Причина, по которой мне не нравится делать это, состоит в том, что, если мне нужно добавить несколько потребителей, мне нужно запустить выше в цикле с размером фактического пула потоков.
Почему вы просто не используете ни одного исполнителя? – sarcan
Непонятно, что здесь находится здесь «ExecutorService», за исключением того, что кажется, что вы не создаете поток, посвященный обслуживанию этой очереди. Вы, конечно же, * воруете * поток для этого, и это не соответствует ожидаемому использованию «ExecutorService». Кроме того, вы глотаете «InterruptedException» здесь, когда вы должны распространять прерывание, вызывая 'Thread.currentThread(). Interrupt()'. – seh