Какую параллельную реализацию Очереди я должен использовать в Java?

Полностью как направляющие, я сказал бы "нет". Но смотрите на Проект Kepler и особенно Орбита , который является платформой MVC. Я делаю веб-материал с ним, и это - действительно забава работать с. У Вас нет материала лесов, который Вы имеете в направляющих, но помимо которого, он имеет orm, механизм шаблонной обработки ( Cosmo), таким образом, можно начать.

123
задан 8 revs, 4 users 45% 8 November 2018 в 09:10
поделиться

3 ответа

В основном разница между ними заключается в характеристиках производительности и блокировке.

Если взять самое простое, то ArrayBlockingQueue представляет собой очередь фиксированного размера. Поэтому, если вы установите размер 10 и попытаетесь вставить 11-й элемент, оператор вставки заблокируется, пока другой поток не удалит элемент. Проблема справедливости заключается в том, что происходит, если несколько потоков пытаются одновременно вставлять и удалять (другими словами, в период, когда Очередь была заблокирована). Алгоритм равноправия гарантирует, что первый поток, который запрашивает, будет первым потоком, который получит. В противном случае данный поток может ждать дольше, чем другие потоки, вызывая непредсказуемое поведение (иногда один поток может занять несколько секунд, потому что другие потоки, которые были запущены позже, обрабатывались первыми). Компромисс заключается в том, что для управления справедливостью требуются накладные расходы, что снижает пропускную способность.

Наиболее важное различие между LinkedBlockingQueue и ConcurrentLinkedQueue заключается в том, что если вы запрашиваете элемент из a LinkedBlockingQueue и очередь пуста, ваш поток будет ждать, пока что-то там не будет. ConcurrentLinkedQueue сразу же вернется с поведением пустой очереди.

Какой из них зависит от того, нужна ли вам блокировка. Когда у вас много производителей и один потребитель, это звучит так. С другой стороны, если у вас много потребителей и только один производитель, вам может не понадобиться поведение блокировки, и вы можете просто попросить потребителей проверить, пуста ли очередь, и продолжить, если это так.

Наиболее важное различие между LinkedBlockingQueue и ConcurrentLinkedQueue заключается в том, что если вы запрашиваете элемент из LinkedBlockingQueue , а очередь пуста, ваш поток будет ждать, пока там что-то есть. ConcurrentLinkedQueue сразу же вернется с поведением пустой очереди.

Какой из них зависит от того, нужна ли вам блокировка. Когда у вас много производителей и один потребитель, это звучит так. С другой стороны, если у вас много потребителей и только один производитель, вам может не понадобиться поведение блокировки, и вы можете просто попросить потребителей проверить, пуста ли очередь, и продолжить, если это так.

Наиболее важное различие между LinkedBlockingQueue и ConcurrentLinkedQueue заключается в том, что если вы запрашиваете элемент из LinkedBlockingQueue , а очередь пуста, ваш поток будет ждать, пока там что-то есть. ConcurrentLinkedQueue сразу же вернется с поведением пустой очереди.

Какой из них зависит от того, нужна ли вам блокировка. Когда у вас много производителей и один потребитель, это звучит так. С другой стороны, если у вас много потребителей и только один производитель, вам может не понадобиться поведение блокировки, и вы можете просто попросить потребителей проверить, пуста ли очередь, и продолжить, если это так.

ваш поток будет ждать, пока что-то там не будет. ConcurrentLinkedQueue сразу же вернется с поведением пустой очереди.

Какой из них зависит от того, нужна ли вам блокировка. Когда у вас много производителей и один потребитель, это похоже на это. С другой стороны, если у вас много потребителей и только один производитель, вам может не понадобиться поведение блокировки, и вы можете просто попросить потребителей проверить, пуста ли очередь, и продолжить, если это так.

ваш поток будет ждать, пока там что-то не будет. ConcurrentLinkedQueue сразу же вернется с поведением пустой очереди.

Какой из них зависит от того, нужна ли вам блокировка. Когда у вас много производителей и один потребитель, это звучит так. С другой стороны, если у вас много потребителей и только один производитель, вам может не понадобиться поведение блокировки, и вы можете просто попросить потребителей проверить, пуста ли очередь, и продолжить, если это так.

49
ответ дан 24 November 2019 в 01:17
поделиться

ConcurrentLinkedQueue означает, что блокировки не выполняются (т. Е. Не выполняются вызовы synchronized (this) или Lock.lock ). Он будет использовать операцию CAS - Сравнить и поменять местами во время модификаций, чтобы увидеть, остается ли головной / хвостовой узел таким же, как при запуске. Если это так, операция завершается успешно. Если головной / хвостовой узел отличается, он будет вращаться и повторить попытку.

LinkedBlockingQueue примет блокировку перед любым изменением. Таким образом, ваши звонки с предложениями будут блокироваться, пока они не будут заблокированы. Вы можете использовать перегрузку предложения, которая требует TimeUnit, чтобы сказать, что вы готовы подождать только X количество времени, прежде чем отказаться от добавления (обычно хорошо для очередей типов сообщений, где сообщение устарело после X количества миллисекунд).

Справедливость означает что реализация Lock будет поддерживать порядок потоков. Это означает, что если поток A входит, а затем входит поток B, поток A первым получит блокировку. Без всякой справедливости, на самом деле неизвестно, что происходит. Скорее всего, это будет следующий запланированный поток.

Что касается того, какой из них использовать, это зависит. Я предпочитаю использовать ConcurrentLinkedQueue , потому что время, необходимое моим производителям, чтобы поставить работу в очередь, различно. У меня не так много продюсеров работают одновременно. Но со стороны потребителя сложнее, потому что опрос не переходит в состояние хорошего сна. Вы должны сами справиться с этим.

Я предпочитаю использовать ConcurrentLinkedQueue , потому что время, необходимое моим производителям, чтобы поставить работу в очередь, различно. У меня не так много продюсеров работают одновременно. Но со стороны потребителя сложнее, потому что опрос не переходит в состояние хорошего сна. Вы должны сами справиться с этим.

Я предпочитаю использовать ConcurrentLinkedQueue , потому что время, необходимое моим производителям, чтобы поставить работу в очередь, различно. У меня не так много продюсеров работают одновременно. Но со стороны потребителя сложнее, потому что опрос не переходит в хорошее состояние сна. Вы должны сами справиться с этим.

111
ответ дан 24 November 2019 в 01:17
поделиться

В заголовке вашего вопроса упоминаются очереди с блокировкой. Однако, ConcurrentLinkedQueue является не блокирующей очередью.

BlockingQueue s - это ArrayBlockingQueue , DelayQueue , , ] LinkedBlockingDeque , LinkedBlockingQueue , PriorityBlockingQueue и SynchronousQueue .

Некоторые из них явно не подходят для ваших целей ( DelayQueue , PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

BlockingQueue : ArrayBlockingQueue , DelayQueue , LinkedBlockingDeque , LinkedBlockingQueue Priority, [111657Queue] 111658] и SynchronousQueue .

Некоторые из них явно не подходят для ваших целей ( DelayQueue , PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

BlockingQueue : ArrayBlockingQueue , DelayQueue , LinkedBlockingDeque , LinkedBlockingQueue Priority, [111657Queue] 111658] и SynchronousQueue .

Некоторые из них явно не подходят для ваших целей ( DelayQueue , PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

LinkedBlockingDeque , LinkedBlockingQueue , PriorityBlockingQueue и SynchronousQueue .

Некоторые из них явно не подходят для ваших целей ( DelayQueue , PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

LinkedBlockingDeque , LinkedBlockingQueue , PriorityBlockingQueue и SynchronousQueue .

Некоторые из них явно не подходят для ваших целей ( DelayQueue , PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

PriorityBlockingQueue и SynchronousQueue ). LinkedBlockingQueue и LinkedBlockingDeque идентичны, за исключением того, что последняя представляет собой двустороннюю очередь (она реализует интерфейс Deque).

Поскольку ArrayBlockingQueue полезен только если вы хотите ограничить количество элементов, я бы остановился на LinkedBlockingQueue .

8
ответ дан 24 November 2019 в 01:17
поделиться