Управление потоками Java и поток приложений - PullRequest
5 голосов
/ 18 января 2011

У меня есть приложение Java, которое загружает информацию (сущности) с нашего сервера.Я использую поток загрузки для загрузки данных.

Процесс загрузки выглядит следующим образом:

  1. Вход в систему - пользовательский объект загружается
  2. На основев пользовательском объекте загрузите список и отображение сущностей «Сообщество» в раскрывающемся списке
  3. на основе раскрывающегося списка «Сообщество», загрузите и покажите «Дерево организации» в JTree
  4. на основе выбора узла, загрузите сущности категории и отобразите в раскрывающемся списке
  5. На основе выбора категории, загрузите сущности подкатегории и отобразите в раскрывающемся списке
  6. На основе выбора подкатегории загрузите большой набор данных и сохраните его

Загрузка происходит в потоке, поэтому графический интерфейс не «зависает».Это также позволяет мне обновлять индикатор выполнения.

Мне нужна помощь в управлении этим процессом.Основная проблема заключается в том, что когда я загружаю данные сущности, мне нужно найти способ дождаться завершения потока, прежде чем пытаться получить сущность и перейти к следующему шагу в потоке приложения.

До сих пор я использовал модальный диалог для управления потоком.Я запускаю поток, открываю модальное и затем удаляю модальное, когда поток закончен.В качестве модального / потока используются Observer / Observable, поток выполняет изменение набора после его завершения и удаления из диалогового окна.Отображение модального режима эффективно останавливает поток приложения, поэтому оно может ждать окончания загрузки.

Я также попытался просто перенести весь рабочий процесс в Observers.Все соответствующие GUI в этом процессе являются наблюдателями.Каждый метод обновления ожидает завершения загрузки, а затем вызывает следующий фрагмент графического интерфейса, который выполняет загрузку самостоятельно.

До сих пор я обнаружил, что эти два метода создают код, за которым трудно следовать.Я хотел бы «централизовать» этот рабочий процесс, чтобы другие разработчики не вырывали свои волосы, пытаясь им следовать.

Мой вопрос: есть ли у вас какие-либо предложения / примеры, где рабочий процесс, такой как этотможно ли управлять способом, который создает код, за которым легко следовать?

Я знаю, что «легко» - относительный термин, и я знаю, что оба моих варианта уже работают, но я хотел бы получить некоторые идеи от других программистовпока у меня еще есть время его поменять.

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 18 января 2011

Возможно, вы захотите изучить использование интерфейса Future. Стоп http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html В нем есть все, что вам может понадобиться, чтобы упростить эти задачи.

0 голосов
/ 20 января 2011

Я думаю, что наиболее распространенный способ сделать это в последних версиях Java - это использовать SwingWorker:

http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

Это позволяет вам запускать фоновые задачи и дает вам удобныйМетод done (), который выполняется в Swing EDT.

0 голосов
/ 18 января 2011

Вы должны создать «модель» для вашего представления, отображающую текущее состояние вашего приложения.Например, для дерева целесообразно показывать узел «Загрузка», когда кто-то открывает триод, потому что в противном случае GUI зависает при открытии узла.

Если поток загрузки завершает загрузку узла, «Загрузка»-узел заменяется результатами асинхронного действия.Это позволяет легко открывать несколько узлов параллельно, поскольку все рабочие потоки просто отвечают за один дочерний узел.

Аналогично при загрузке чего-либо: рабочие затем обновляют процесс загрузки.Здесь на ум приходит диалог загрузок Firefox.

Хорошие графические интерфейсы не легки :).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...