Java качели параллелизм, множественные свойства, схожие слушатели?

У меня есть панель с именем DataPanel, которая расширяет JPanel, и рабочая группа с именем DataPanelWorker, которая расширяет SwingWorker.

В настоящее время, когда я создаю DataPanel, я запускаю DataPanelWorker, который выполняет некоторые вычисления и запускает изменения свойств после каждого вычисления.

DataPanel прослушивает эти изменения свойств и каждый раз отображает сообщение. например, "Расчет 1 завершен" "Расчет 2 завершен"

Это отлично работает!

Теперь я хочу создать второй экземпляр DataPanel (назовем его DataPanel2), но я хочу использовать оригинальный DataPanelWorker для сохранения вычислений. Я регистрирую DataPanel2 как еще один propertyChangeListener на DataPanelWorker.

Моя проблема в том, что я могу зарегистрировать DataPanel2 после того, как вычисление 1 будет завершено и будет запущено первое свойство propertyChangeEvent. Как узнать, как далеко проходит рабочий, чтобы я мог заставить DataPanel2 отображать те же сообщения, что и DataPanel1?

В идеале я хотел бы сохранить очередь propertyChangeEvents и при регистрации нового компонента запускать их все только на этом компоненте. Есть ли стандартный способ сделать это? Или я смотрю на это с неправильной точки зрения?

Спасибо

1 ответ

Концептуально, ваш SwingWorker должен publish() временные случаи Calculation чтобы process() можете обновить ваш DataModel и уведомить любых слушателей.

class DataPanelWorker extends SwingWorker<List<Calculation>, Calculation> {…}
class DataModel {
    private List<Calculation> list = new ArrayList<>();
    …
}

Ваша реализация process() может затем обновить ваш DataModel в потоке отправки событий. Таким образом, ваш DataModel всегда имеет полное состояние расчета. Любое прослушивание DataPanel могу спросить DataModel для текущего List<Calculation> для отображения. Ваш DataModel может уведомить слушателей о поступлении новых данных, используя любой из подходов, показанных здесь. Этот пример обновляет JLabel; этот пример также обновляет диаграмму; этот пример обновляет TableModel прослушивания JTable,

DataPanelWorker… Выполняет некоторые вычисления и запускает изменения свойств после каждого расчета.

Избегайте событий изменения свойств в вашей реализации doInBackground(), поскольку доступ к любым общим данным должен быть синхронизирован независимо от работника. Вместо этого обновите свой DataModel в вашей реализации process(), который синхронизирует доступ для вас. DataModel может затем инициировать события для зарегистрированных слушателей, зная, что обновления будут происходить в потоке отправки событий.

Есть ли способ приостановить doInBackground() нить?

Это разрешено, но вы не должны делать это в этом контексте. При необходимости несколько работников могут сотрудничать, как показано здесь.

Другие вопросы по тегам