У меня есть объект, который создает 10 потоков. Этот объект имеет коллекцию пользователей. Каждый из этих потоков может либо проверять, существует ли конкретный пользователь, либо добавлять/удалять пользователей из коллекции.
Мне интересно, как мне реализовать это общение.
Должен ли я передавать коллекцию пользователей в каждый поток через конструктор или метод внутри потоков?
Должен ли я передавать основной объект в каждый поток, чтобы они могли получить доступ к свойствам объекта? Или, может быть, внутри основного объекта есть специальные методы для обработки пользовательской коллекции, которую будут вызывать потоки?
Я не уверен, что это лучшая практика в этой ситуации.




Насколько я понимаю, вам нужна структура, которая должна быть потокобезопасной, чтобы любой поток мог добавлять и удалять пользователя. Я предлагаю вам использовать java.util.concurrent.CopyOnWriteArrayList, который должен содержать пользователей. Это должно быть что-то вроде этого.
CopyOnWriteArrayList<User> copwl = new CopyOnWriteArrayList<>();
Здесь пользователь является объектом.
Если вы хотите, вы можете передать этот список в потоки.
Хорошо. Что, если мне нужно уведомить объект, который создал потоки, чтобы сделать что-то, можно ли тогда передать ссылку на объект в каждый поток, чтобы они могли вызывать его (объект, который их создал) методы? Я не уверен, что ты меня понимаешь
Я не мог понять, что вы сказали в комментариях выше.
В качестве примечания, использование CopyOnWriteArrayList обычно предпочтительнее, если вы перебираете список больше, чем пишете в него, если вы собираетесь создавать и писать много новых пользователей, вы можете рассмотреть другой тип объекта.
Вы захотите сохранить свои пользовательские объекты в потокобезопасной структуре данных, это гарантирует, что ваши потоки не столкнутся с какими-либо условиями гонки во время добавления/удаления пользовательских объектов.
Вы должны взглянуть на Параллельные коллекции, предлагаемый java. Вы также можете использовать синхронизированную версию стандартной коллекции Java, полученную с помощью Collection.synchronizedCollection см. здесь
Можно передать эту структуру данных в конструктор каждого потока, чтобы у вас был доступ к коллекции в каждом потоке.
Я понимаю, что мне нужна потокобезопасная структура. Но вопрос не в этом. То, о чем я спрашиваю, в основном состоит из плюсов и минусов: A: передать структуру в потоки или B: объявить структуру общедоступной и передать весь объект в потоки, а затем потоки могут сделать что-то вроде: this.parentObject.users.add(...). Я специально спрашиваю, подходит ли B, если когда-нибудь позже мне нужно будет использовать какие-то другие структуры объекта, так что, может быть, это плохая практика - передавать каждую отдельную структуру потокам?
Итак, если я правильно вас понимаю, вы спрашиваете, лучше ли передавать структуру данных каждому потоку через конструктор (A) или вы должны просто разрешить им доступ к структуре данных, либо объявив ее общедоступной, либо имея геттерный метод для него (B)? Я думаю, это зависит от того, что вы считаете лучшим с точки зрения будущего развития проекта. Да, если вы считаете, что вам понадобится доступ ко многим коллекциям из родительского класса, тогда лучше иметь общедоступные структуры/использование геттеров (вариант B).
Да, вы можете передать конструктор потока. Вы можете написать небольшую программу для проверки.