ArrayList, который поддерживает многопоточность - PullRequest
0 голосов
/ 24 мая 2011

Мне нужно записать arraylist в файл.
Он заполняется все время, и когда он становится слишком большим, мне нужно начать его писать.

Поэтому я решил проверить, когда размер массива массивов больше 100, а затем добавить файл и записать текущие строки.
Но проблема в том, что иногда он не заполняется в течение нескольких минут, и я захочу сбросить данные в файл.
Поэтому моей второй мыслью было создание другого потока, который будет проверять наличие строк каждые несколько секунд и выводить его в файл.
Но тогда мне нужно было бы управлять блокировками между потоками.

Мои вопросы:
1. Многопоточный дизайн в порядке?
2. Существует ли arraylist, поддерживающий многопоточность в любой форме?

Ответы [ 8 ]

2 голосов
/ 24 мая 2011

Вместо ArrayList Я бы порекомендовал вам использовать правильную реализацию Queue<E>.Если вы только добавляете данные в список, а затем сбрасываете их в файл, удаляя сохраненные элементы из списка, очередь является гораздо лучшим выбором.

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

2 голосов
/ 24 мая 2011

Из вашего вопроса видно, что большую часть времени вы собираетесь выполнять операцию записи, и это тоже из одного потока и будет периодически проверять размер списка.в противном случае вы не можете использовать обычный старый ArrayList.

, синхронизирующий список и затем использующий блокировки для доступа к списку, выглядит как излишнее.вместо этого используйте проверку if, которая проверит размер.

Если вы собираетесь обращаться к списку в нескольких потоках, тогда, чтобы избежать исключения ConcurrentModificationException, используйте метод, предложенный @ Ludevik

Также существуют и другие подходы.но ради простоты подход @Ludevik отвечает всем требованиям.

2 голосов
/ 24 мая 2011

Вы можете создавать синхронизированные списки, используя Collections.synchronizedList .

2 голосов
/ 24 мая 2011

Проверьте это поток .

Вы должны использовать

 List synchronizedList = Collections.synchronizedList(list);
1 голос
/ 24 мая 2011

Вам необходимо использовать Collections.synchronizedList (List) , чтобы создать потокобезопасный список.Однако вам все равно нужно синхронизировать такие операции, как добавление или удаление, и синхронизировать обновления с объектами, содержащимися в списке.

1 голос
/ 24 мая 2011

ArrayList не является потокобезопасным, но вы можете получить потокобезопасный список с Collections.synchronizedList ()

1 голос
/ 24 мая 2011

Вместо массивов вы можете использовать векторы. Поскольку векторы являются поточно-ориентированными.

0 голосов
/ 24 мая 2011

Простыми решениями являются Collections.synchronizedList(list) или Vector. Тем не менее, есть ошибка.

Метод iterator() для синхронизированного списка / Vector, созданный, как указано выше, НЕ синхронизируется. Так что ничто не мешает потоку попытаться добавить новый элемент в список, если вы копируете его явно с помощью итератора, используя for (type var : list) {...} или используя конструктор копирования, который опирается на итератор.

Это может привести к одновременным исключениям модификации. Чтобы избежать этой проблемы, вам нужно сделать собственную блокировку.


Возможно, лучше использовать параллельный класс Queue, чтобы потоку, который записывает данные в файл, не приходилось повторять список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...