Если мой worker-класс наследуется от Thread и в нем есть public-метод, который вызывается из основного потока, то метод будет выполнен в основном потоке, или как? И если верно, что в основном, то вот ещё вопрос поконкретнее: как в этом случае избежать fail-fast поведения итераторов, если мне нужно в один ArrayList дописать содержимое второго (которое из главного потока приходит), а в этот момент сам поток по идее занимается обработкой евонного, ArrayList'a-первого, содержимого?
Кроме синхронизации ничего в ум не приходит, но думаю она негативно повлияет на скорость обработки (в worker'ы данные довольно часто будут поступать из основного потока, который ввод), так что если есть альтернативы — ткните носом, прошу вас.
Если вы не сильно разбираетесь в потоках, синхронизациях итд (а судя по первому вопросу это так), то я бы вам посоветовал как вариант использовать потокобезопасные коллекции из пакета java.util.concurrent.
Ну или самому писать синхронизацию.
p.s. если метод явно вызывать из основного потока, естественно он в нем и будет выполнятся. Неважно в каком классе он объявлен.
Да, я правда в потоках не сильно разбираюсь.
Всё, что смог придумать — добавить временный ArrayList, куда основной поток без синхронизации складывает работу для worker (основной поток один, думаю не страшно ведь). В worker же этот временный массив синхронизируется, и если новая работа есть — она забирается в первый ArrayList, а временный сразу по окончании забора отпускается, чтобы в него снова можно было писать из основного потока. Я на верном пути? Или в таком подходе есть неочевидные мне проблемы?
И ещё последнее: на этот кусок netbeans выдает хинт — синхронизация по неполному полю. Можете пояснить, чем это грозит и почему происходит(судя по нагугленому — потому, что workToDoNext изменяется в синхронизированом блоке, нет?)?
У вас синхронизация производится по workToDoNext, а в это время workToDoNow не залочен.
Вообще тут общих советов не дать. Thread-safe это целая наука — надо видеть намного большую часть вашего кода, чтобы подсказать что-либо конкретное. Про синхронизацию потоконебезопасных коллекций есть глава в Java Concurrency in Practice.
workDoNow не используется нигде, помимо потока-worker'a. У каждого воркера workDoNow собственный, как и временный массив. Поскольку ни чтение ни запись из других потоков в workDoNow конкретного потока не ведется, надобности дополнительно синхронизировать его не вижу.
За последнее вам отдельно спасибо — тема интересная, прочту на досуге.
Вообщем-то вопрос решен, если и остались некоторые косяки в коде, то раньше чем пока моя кучка классов не вырастет в приложение их я не найду. Спасибо всем вышеотписавшимся.