Поддержка. Есть несколько потоков, выполняющих задачи запроса, каждый из которых будет возвращать list
в качестве результата. Какая структура данных будет быстрее объединять результаты?
Неограниченная потокобезопасная очередь на основе связанных узлов. Эта очередь упорядочивает элементы FIFO (first-in-first-out). Голова очереди - это элемент, который находится в очереди дольше всех. Хвост очереди - это тот элемент, который находился в очереди самое короткое время. Новые элементы вставляются в конец очереди, и операции извлечения очереди получают элементы в начале очереди. ConcurrentLinkedQueue - подходящий выбор, когда многие потоки будут совместно использовать доступ к общей коллекции. Как и большинство других реализаций параллельных коллекций, этот класс не позволяет использовать нулевые элементы. В этой реализации используется эффективный алгоритм "без ожидания", основанный на алгоритме, описанном в книге Магед М. Майкл и Майкла Л. Скотта в книге "Простые, быстрые и практические неблокирующие и блокирующие параллельные алгоритмы очереди".
Как следует из названия, CopyOnWriteArrayList создает копию базового ArrayList с каждой операцией мутации, например. добавить или установить. Обычно CopyOnWriteArrayList очень дорого обходится, потому что он включает в себя дорогостоящее копирование массива с каждой операцией записи, но он очень эффективен, если у вас есть список, в котором количество итераций превышает количество мутаций, например в основном вам нужно перебирать ArrayList и не изменять его слишком часто.
List<City> getCityListByIds(List<Long> idList)
,idList
может быть очень большим, поэтому запрос может быть очень медленным. Поэтому я разделил большойlist
на несколько маленькихlist
и преобразовал их вCallable
задачи, а затем отправил их вThreadPoolExecutor
. Вот почему у меня такой вопрос. Извините за мой плохой английский. @MarkoTopolnik @tucuxi - person zhumengzhu   schedule 19.09.2016ConcurrentLinkedQueue
может быть быстрее, поэтому провожу простой тест. Но результат показывает, чтоCopyOnWriteArrayList
быстрее. Я не уверен, что мой тестовый код был правильным, потому что вы знаете, что написать правильный параллельный тест сложно и сложно. - person zhumengzhu   schedule 19.09.2016Java Streams API
кажется особенностьюJava 8
, сейчас я могу использовать толькоJava 7
в своей работе. - person zhumengzhu   schedule 19.09.2016ExecutorCompletionService
, вы можете собрать результаты, как только они будут готовы, все в основном потоке. - person Marko Topolnik   schedule 19.09.2016