Каков предпочтительный способ взаимодействия потока с создавшим его объектом?

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

Мне интересно, как мне реализовать это общение.

Должен ли я передавать коллекцию пользователей в каждый поток через конструктор или метод внутри потоков?

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

Я не уверен, что это лучшая практика в этой ситуации.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
66
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Насколько я понимаю, вам нужна структура, которая должна быть потокобезопасной, чтобы любой поток мог добавлять и удалять пользователя. Я предлагаю вам использовать java.util.concurrent.CopyOnWriteArrayList, который должен содержать пользователей. Это должно быть что-то вроде этого.

CopyOnWriteArrayList<User> copwl = new CopyOnWriteArrayList<>();

Здесь пользователь является объектом.

Если вы хотите, вы можете передать этот список в потоки.

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

Sambit 07.06.2019 20:13

Хорошо. Что, если мне нужно уведомить объект, который создал потоки, чтобы сделать что-то, можно ли тогда передать ссылку на объект в каждый поток, чтобы они могли вызывать его (объект, который их создал) методы? Я не уверен, что ты меня понимаешь

m_bale 07.06.2019 20:26

Я не мог понять, что вы сказали в комментариях выше.

Sambit 07.06.2019 20:30

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

Adam McClenaghan 07.06.2019 20:39
Ответ принят как подходящий

Вы захотите сохранить свои пользовательские объекты в потокобезопасной структуре данных, это гарантирует, что ваши потоки не столкнутся с какими-либо условиями гонки во время добавления/удаления пользовательских объектов.

Вы должны взглянуть на Параллельные коллекции, предлагаемый java. Вы также можете использовать синхронизированную версию стандартной коллекции Java, полученную с помощью Collection.synchronizedCollection см. здесь

Можно передать эту структуру данных в конструктор каждого потока, чтобы у вас был доступ к коллекции в каждом потоке.

Я понимаю, что мне нужна потокобезопасная структура. Но вопрос не в этом. То, о чем я спрашиваю, в основном состоит из плюсов и минусов: A: передать структуру в потоки или B: объявить структуру общедоступной и передать весь объект в потоки, а затем потоки могут сделать что-то вроде: this.parentObject.users.add(...). Я специально спрашиваю, подходит ли B, если когда-нибудь позже мне нужно будет использовать какие-то другие структуры объекта, так что, может быть, это плохая практика - передавать каждую отдельную структуру потокам?

m_bale 07.06.2019 20:45

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

Adam McClenaghan 07.06.2019 21:03

Другие вопросы по теме