У меня есть поток, загружающий данные, и я хочу дождаться завершения загрузки до загрузки данных. Есть ли стандартный способ сделать это?Java Подождите, пока закончится поток
Дополнительная информация:
У меня есть класс загрузки, который получает данные из URL (Serialized Pojos). Загрузка является Runnable и Observable. Он отслеживает загруженные и загружаемые байты. У меня есть индикатор выполнения, который отображает прогресс для Пользователя. Графический интерфейс пользователя Download Download, чтобы обновить индикатор выполнения.
Когда POJO загружается, я хочу его получить и перейти к следующему шагу. Каждый шаг должен дождаться завершения предыдущего. Проблема в том, что я не могу придумать способ приостановить мое приложение, чтобы дождаться потока загрузки. После завершения загрузки я хочу вызвать download.getObject(), который вернет данные как объект. Затем я могу использовать его и перейти к следующей загрузке.
У меня есть вспомогательный класс, который управляет URL-адресами для загрузки и делает все вызовы Download. Этот вызов вызовет getObject и выполнит кастинг. Gui вызывает helper.getUser(). хелпер запускает поток, и я хочу, чтобы он «знал», когда он закончен, чтобы он мог вернуть литой объект.
Любые предложения/примеры? Я нахожусь на начальных этапах этого проекта, поэтому я готов его изменить.
Благодарим вас.
Обновление:
Я следовал http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html#get и использовал модальный блокировать, пока поток не закончен. Код был очень грязным, и мне не нравится этот подход. Я буду продолжать пытаться найти «чистый» способ обработать рабочий процесс процессов загрузки.
Я попытался присоединиться(), но сохранил GUI от обновления. Причина, по которой я использовал Thread, заключалась в том, чтобы сохранить обновление gui во время загрузки. Вызов соединения прекращает это. – Allan
join() будет работать. если графический интерфейс перестает обновляться, вы, вероятно, должны быть более подробными о том, какие потоки вы присоединяете. Я бы не присоединился к EDT. – akf
Затем вам нужно убедиться, что вы не вызываете 'join()' в качающемся потоке. Вы можете сделать это, создав один поток, который отвечает за ваш поток загрузки. Это, по сути, просто фоновой работник, о котором вы можете забыть. Это рабочий поток, который знает, когда загрузка заканчивается и что делать в этот момент. Вам просто нужно убедиться, что редактирование объектов качания выполняется в качающейся нити. – unholysampler