2013-10-02 3 views
0

У меня есть два потока на моем уровне модели данных, которые работают в «параллельном» и оба вычисляют некоторые значения. У меня есть установка шаблона mvc, поэтому моя модель данных имеет два массива, каждый из которых отвечает за значения, генерируемые из каждого из моих потоков. Как я могу сказать, что мои массивы имеют новые данные без блокировки основного интерфейса?Обновление представления из результатов параллельных потоков

Мои темы предназначены для проезда по таймеру раз в х секунду и производятся по одному целым числам. Каждый из них должен быть добавлен в массив, и при добавлении представление должно получить уведомление через шаблон наблюдателя для обновления экрана в соответствии с обновленными значениями двух массивов. Это должно происходить без блокировки основной нити. Таким образом, я не могу действительно делать (true) или задавать значение futureValue для каждого потока, поскольку это заставит мой u ждать до тех пор, пока потоки не будут выполнены. Что я могу сделать?

+1

Вы можете использовать либо [шаблон наблюдателя] (http://www.oodesign.com/observer-pattern.html), либо, возможно, [производитель/потребительский паттерб] (http://java.dzone.com/articles/manufacturer-consumer-pattern) в зависимости от ваших потребностей. – MadProgrammer

+0

Могу ли я потенциально иметь invokeLater в моем потоке, который обновляет массив (если я передаю его в поток)? –

+0

@JohnBaum Да, вы можете использовать invokeLater (или invokeAndWait), чтобы иметь возможность перекрасить определенный компонент. – Kayaman

ответ

1

Вы всегда будете:

  • Продлить класс массива, содержащий результаты и перезаписать add метод
  • Помещенный в add в конце кода сообщить UI-нить
  • Чтобы синхронизировать обновления, вы можете использовать ExecutorService только с одним потоком, который вы получите с Executors.newSingleThreadExecutor(). В этом вам submit() код для информирования UI-Thread.
  • Ваше исполнение должно быть частью WorkerThread и обрабатываться в doInBackground
  • В методе done() обновить интерфейс пользователя (done() выполняется на диспетчерский потока событий Свинг)

для получения дополнительной информации смотрите здесь Threads and Swing

+0

Я использую качели. И почему синхронизировать? Я только обновляюсь внутри потоков, и каждый поток имеет свой собственный массив. –

+0

О, каждый поток имеет свой собственный массив. Я соответствующим образом отредактировал свой ответ. – jboi

0

Это похоже на довольно сложный подход. Вот мое:

  • Создать blocking queue
  • избавиться от массивов и имеют каждая нить поставить свои результаты в очереди
  • Start рабочий поток, который ждет элементов в очереди
  • Использование SwingUtilities.invokeLater() в рабочем потоке для обновления пользовательского интерфейса.
Смежные вопросы