Я не уверен, что это решение, которое вы должны использовать, и оно подрывает простоту и безопасность, которую вы получаете от использования SwingWorker, но я упомяну его для полноты.
Поместите два поля, где оба потока могут их видеть: одно логическое значение, называемое hasValue
, инициализированное как false, и одно целое (или длинное), называемое countValue
. Оба должны быть объявлены как volatile
. Когда счетчик завершит работу, поместите счет в countValue
. Тогда установить hasValue
в true. Затем поток деления может периодически проверять hasValue и получать счетчик, когда он доступен.
Если подразделение предоставляет значения, которые будут более точными после получения счетчика, это будет сделано. Скорее всего, он делает какую-то работу, а затем ждет счета. В этом случае установите третье поле с именем countMonitor
, определенное как final Object
. Когда он завершит начальную работу, попросите его проверить hasValue
. Если это правда, возьмите значение и продолжайте. Если значение равно false, вызовите метод wait
для countMonitor
и продолжайте при получении уведомления. Поток счетчика, когда это сделано, всегда должен вызывать метод notifyAll
для countMonitor
после , помещая значения в hasValue
и countValue
.
Я здесь немного не учел. Javadoc для Object
расскажет вам о необходимой синхронизации и проверенных исключениях. Ваш дизайн достаточно прост, чтобы вас не беспокоили обычные сверхъестественные истории ужасов, создаваемые многопоточностью. Я надеюсь. Но вы, возможно, захотите провести небольшое исследование, если вы пойдете по этому пути. (Если вы повторите весь процесс в одном сеансе, вы определенно захотите провести лот исследований.)