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()
нить?
Это разрешено, но вы не должны делать это в этом контексте. При необходимости несколько работников могут сотрудничать, как показано здесь.