Банальный вопрос по потокам

Если мой worker-класс наследуется от Thread и в нем есть public-метод, который вызывается из основного потока, то метод будет выполнен в основном потоке, или как? И если верно, что в основном, то вот ещё вопрос поконкретнее: как в этом случае избежать fail-fast поведения итераторов, если мне нужно в один ArrayList дописать содержимое второго (которое из главного потока приходит), а в этот момент сам поток по идее занимается обработкой евонного, ArrayList'a-первого, содержимого?
Кроме синхронизации ничего в ум не приходит, но думаю она негативно повлияет на скорость обработки (в worker'ы данные довольно часто будут поступать из основного потока, который ввод), так что если есть альтернативы — ткните носом, прошу вас.
  • Вопрос задан
  • 4243 просмотра
Решения вопроса 1
SSiarhei
@SSiarhei
Если вы не сильно разбираетесь в потоках, синхронизациях итд (а судя по первому вопросу это так), то я бы вам посоветовал как вариант использовать потокобезопасные коллекции из пакета java.util.concurrent.

Ну или самому писать синхронизацию.

p.s. если метод явно вызывать из основного потока, естественно он в нем и будет выполнятся. Неважно в каком классе он объявлен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
gvsmirnov
@gvsmirnov
Возможно, прежде чем пытаться сделать что-то многопоточное, стоит изучить, как работает многопоточность? Ваши вопросы явно указывают на то, что вы этого не знаете. Я бы порекомендовал для начана освоить Модель Памяти Java.

Теперь по содержанию: естественно, метод выполняется в том потоке, который его вызвал.

А вы уверены, что вам нужно именно в конец ArrayList дописывать? Потому что описанная ситуация (особенно вместе с ключевым словом worker) намекает на то, что вам нужна рабочая очередь, в которую главный поток будет класть и из которой воркер будет брать, пока ему не придёт время остановиться. Для этого есть много специализированных классов в стандартной библиотеке. Например, ConcurrentLinkedQueue или ArrayBlockingQueue.

Если же вам всё-таки нужно в конец одного массива дописать атомарно и потоко-безопасно другой, то посмотрите на CopyOnWriteArrayList.html#addAll(java.util.Collection).

Если не устроит — делайте синхронизацию, не бойтесь тормозов и не занимайтесь преждевременной оптимизацией того, чего не понимаете.
Ответ написан
Комментировать
@Xazzzi Автор вопроса
ಠ_ಠ
workDoNow не используется нигде, помимо потока-worker'a. У каждого воркера workDoNow собственный, как и временный массив. Поскольку ни чтение ни запись из других потоков в workDoNow конкретного потока не ведется, надобности дополнительно синхронизировать его не вижу.
За последнее вам отдельно спасибо — тема интересная, прочту на досуге.
Вообщем-то вопрос решен, если и остались некоторые косяки в коде, то раньше чем пока моя кучка классов не вырастет в приложение их я не найду. Спасибо всем вышеотписавшимся.

UPD: Промахнулся с ответом, это в ветку выше.
Ответ написан
Комментировать
Colwin
@Colwin
Ведущий Java-разработчик
если и остались некоторые косяки в коде, то раньше чем пока моя кучка классов не вырастет в приложение их я не найду.


<irony>Вы расписываетесь, что вы — быдлокодер?</irony> :-)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
25 янв. 2022, в 18:00
5000 руб./за проект
25 янв. 2022, в 17:04
7000 руб./за проект