Потоки Java, вызывающие методы на общем объекте Data Collector, возможны? - PullRequest
1 голос
/ 17 июля 2011

Идея: У меня есть сервлет веб-сервиса JAX-RS (объект с именем webServlet), который создает экземпляр объекта сбора данных dataCollector и передает этот объект нескольким потокам в их конструкторе.Эти потоки запрашивают результаты на веб-сайтах, а затем вызывают метод dataCollector.add(result), чтобы добавить результаты в очередь в общей dataCollector.

У меня есть два вопроса относительно этой идеи:

1) Могут ли несколько потоков вызывать методы одного общего объекта одновременно?

2) Как мой webServlet объект проверяет, завершены ли все потоки для отображения страницы результатов?Должен ли я позволить своему webServlet подождать, пока все потоки будут запущены, чтобы у меня был полный список результатов, и как мне это сделать?

1 Ответ

2 голосов
/ 17 июля 2011

1) Да, но, возможно, не безопасно. В частности, если очередь в вашем dataCollector не является потокобезопасной очередью, такой как ConcurrentLinkedQueue , вы рискуете ConcurrentModificationException , когда поток вызывает для нее add ().

2) a) Использовать ExecutorService (возможно, полученный от Executors ) для отправки Callables или Runnables . Сохраните Фьючерсы , которые были возвращены, и используйте get () , чтобы дождаться окончания работы.

б) У вас нет до. Выбор остается за вами. Если вы отправите ответ до того, как работа будет завершена, у вас, очевидно, не будет полного результата.

в) См. А).

Если это все новое для вас, вы можете проверить Параллельность в учебниках по Java .

...