2013-07-04 2 views
7

Я работаю над игрой для Android, и я только заметил, что с onTouchEvent работает в потоке пользовательского интерфейса, а методы update/render запускаются из отдельных потоков, причем оба из них обновляют ArrayList, который содержит сущности. Поэтому очевидно, что они конфликтуют, если они могут изменить список одновременно.Переход от ArrayList к вектору

Я читал, что класс Vector используется точно так же, как ArrayList с той лишь разницей, что синхронизирован Vector, ergo они не конфликтуют. Это правда? если да, имеет ли он какие-либо проблемы с производительностью или что-то, о чем я должен беспокоиться? Раньше я никогда не использовал класс Vector.

EDIT: , что я на самом деле имел в виду переход от

ArrayList<Obj> list = new ArrayList<Obj>();

в

Vector<Obj> list = new Vector<Obj>()

Но, как говорят ответы, Vector не рекомендуется использовать. Выбранный ответ решил мою проблему.

+2

'VECTOR' устарела, так что вы не должны использовать его – BackSlash

+0

Технически это не так, но на самом деле это древний и в зависимости от использование случая «Список» из пакета «Concurrent», вероятно, будет лучше. –

+0

Jon Skeet объясняет, почему не использовать Vector здесь: http://stackoverflow.com/q/1386275/1065197 –

ответ

9

Это старичок Vector попытка не использовать Vector вместо этого использовать

synchronizedList

Пример:

list = Collections.synchronizedList(list); 

Вектор считается устаревшим и устаревшим чтения Why vector is considerer obsolete?

+0

Это решает: 'Список list = Collections.synchronizedList (новый ArrayList ());' –

+0

yep, you получил это;) прочитал ответ Джона Скита в ссылке, которую я написал, интересно :) – nachokk

+0

Да, это довольно интересно. Это действительно помогло мне немного понять о «синхронизированном» блоке. Я новичок в этом (: –

2
List<Foo> list = new Vector<Foo>(new ArrayList<Foo>()); 

должен работать. Обе эти структуры реализуют интерфейс List.

Но, как и другие люди, это не рекомендуется.

+2

Этот фрагмент кода не имеет большого смысла. Он добавит элементы из пустой ArrayList для созданного экземпляра 'Vector'. – nif

+1

Насколько я понял, это то, о чем просил Кристофер Франциско. Вектор с данными из ArrayList. Новый список массивов - это только своего рода макет. – ArturSkowronski

+1

Вы понимаете, что у вашего кода даже нет логического смысла? Кроме того, если вы действительно хотите помочь ОП, вы должны знать и ** помогать другим изучать **, что ** Вектор не рекомендуется использовать **. –

0

Как уже упоминалось, nachokk, synchonizedList будет делать трюк. synchronizedList вернет оболочку вокруг вашего списка, поэтому копирование не будет выполнено.
Недостатком является то, что только один вызов списка может быть выполнен за раз. Два чтения в списке будут последовательными, даже если они могут быть выполнены параллельно. Синхронизированные блоки всегда означают небольшие накладные расходы и уменьшают производительность при частом вызове.

Другим вариантом является использование параллельного списка. Это означает, что копия в первую очередь, но производительность доступа может быть значительно улучшена. Если у вас много запросов на чтение (например, для картин), то хорошим выбором будет CopyOnWriteArrayList. Считывается почти так же быстро, как обычный ArrayList и не будет заблокирован. Запись в список будет последовательной и дорогостоящей, так как они должны скопировать весь массив.
Другим хорошим моментом для CoWArrayList является то, что вы можете выполнять итерацию, не перехватывая ConcurrentModificationException. Итератор, возвращаемый iterator(), всегда будет использовать один и тот же массив поддержки, даже если список изменился.

20

Для тех, кто должен бороться с унаследованным кодом делать только следующее:

new Vector<Obj>(anyThingWhichImplemntsCollection); 
Смежные вопросы