Случай 1: что-то сделать, затем подождать результатов и продолжить.
myThread.join()
- для случаев, когда код, создавший поток, выполняет еще кое-что после запуска потока, а затем хочет дождаться результата потока. Как только код потока готов, поток умирает, и, следовательно, приложение продолжает выполнение после вызова join ().
Чтобы предоставить информацию о приложении из потока, вам нужно ее где-то сохранить, например, в поле, предназначенном для этого. Вам не нужно беспокоиться о синхронизации, потому что после того, как поток умирает, все его действия станут «общеизвестными», они больше не будут работать по расписанию (или что-то еще).
Случай 2: Продолжайте делать что-то и регулярно проверяйте, есть ли результаты.
Если вместо этого вы намерены создать какой-то игровой цикл, в котором вы продолжаете делать что-то, а ваша дополнительная нить предназначена только для того, чтобы в конечном итоге доставить вам некоторые товары (например, визуализировать фоновое изображение звезды, когда ваша игра уже запущена) , снова вы должны передать его приложению в поле (он же переменная класса).
В этом случае, однако, вам нужно беспокоиться о синхронизации. Потому что, поскольку игровой цикл продолжает проверять, изменилось ли поле с null
на значение, два потока соревнуются друг с другом.
Итак, в этом случае вам потребуется дополнительный объект для синхронизации, в идеале выделенный для этой задачи, например, final private Object lockForBackgroundCalculation = new Object();
, и когда поток записывает свое значение результата в другое поле, вы переносите этот оператор в synchronized(lockForBackgroundCalculation){...}
, а также сверяете проверку игрового цикла значения поля в тот же текст блока синхронизации.