2015-08-28 2 views
1

Я разрабатываю приложение Java на основе SWING с многопотоковой обработкой.Многопоточность Java и SWING

Идея состоит в том, чтобы создать набор фоновых «задач/сервисов» для выполнения нескольких задач.

Моя проблема заключается в том, как реализовать многопоточность (на нижнем уровне приложения), которая может взаимодействовать с графическим интерфейсом, отображая компоненты SWING при определенных условиях.

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

Какие у вас варианты?

Заранее спасибо.

EDIT

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

+0

Создайте свою «многопоточную кодовую базу» независимо от SwingWorker и просто используйте эту кодовую базу в SwingWorkers. Я имею в виду отдельные проблемы и использую крошечный слой абстракции/клей между вашей SwingWorkers и «многопоточной кодовой базой». Возможно, вы даже можете создать дизайн, ориентированный на события/шины. – Xeon

+0

@Xeon Могли бы подробнее рассказать о вашем ответе? Что вы подразумеваете под кодовой базой и «ориентированным на события/автобусом»? Не могли бы вы привести пример (ссылку или что-то еще) о том, что вы предложили? – nervousDev

+0

@nervousDev вы можете посмотреть, например, как работает GWT EventBus. Концепция точно такая же. –

ответ

2

, но с другой стороны, я также не хочу, чтобы мои классы многопоточности зависели от классов GUI.

Как насчет использования шаблона Observer/Listener? Ваши фоновые задачи, запущенные SwingWorker, могут сообщать о некоторых других компонентах, когда есть такая необходимость. Комментарий @Xeon указывает на то, что вы в хорошем направлении.

Личный совет: начинайте с некоторого решения, а затем постоянно реорганизуйте, когда код становится нечитаемым.

кстати. Надеюсь, вы помните прежнее правило: Swing components should be accessed on the Event Dispatch Thread only;)

+0

Я забыл упомянуть, что эти фоновые задачи нужно запускать в начале (я отредактирую вопрос, см. Там, пожалуйста). – nervousDev

+0

@nervousDev это не проблема. Тем не менее ваше приложение может реагировать на события, исходящие из ваших фоновых задач. –

1

Вам нужно узнать о шаблонах проектирования параллелизма, таких как актеры, фьючерсы, поток и т. Д. Приведенное событие означает, что у вас нет кода блокировки, например. вместо того, чтобы ждать вас и постоянно спрашивать, закончите ли вы свою задачу, просто скажите мне, как только вы будете готовы.

Если вы идете по маршруту актера, вы можете обернуть свой класс gui в контроллер, который будет актером, который будет обрабатывать одно сообщение за раз. Вам нужно быть осторожным с качелями, что вы не создаете циклы событий, так как в событии A запускается событие B, которое вызывает событие A снова и так далее.

Вот почему шаблон для наблюдения может быть приятным для отображения данных.

Но, к сожалению, нет серебряной пули для параллелизма, модель актера поднимается, а также фьючерсы (посмотрите на акку), но это по сути сложная задача, поэтому всегда будет трудно получить право ,

По сути, я бы сказал, что самый простой подход - это сделать очень строгие правила в отношении того типа параллелизма, который вы готовы разместить, вам нужно подумать о последствиях добавления каждого бита параллельной функциональности и какого эффекта это имеет. Затем создайте свой код на основе этого, используя хорошо установленную модель параллелизма.

+1

Благодарим вас за разъяснения. Я знаю шаблоны проектирования, но не столько применительно к многопоточным приложениям. Я использую дизайн по слоям (GUI, контроллер, модель и т. Д.). Вот почему я не хочу, чтобы такие важные и соответствующие классы, как многопоточные, зависели от других классов. – nervousDev

+0

Не стоит беспокоиться, я бы также упомянул, что не многие люди больше делают настольные приложения в Swing, и даже меньше людей делают многопоточные настольные приложения, это будет очень сложная задача, поэтому удачи. Я создал сервер и клиент для создания рабочего стола для проекта, который был многопоточным, используя akka. Это позволяет вам контролировать, сколько проверок и сборок может произойти в любой момент времени, подумал, что потребуется 2 недели, потребовалось 2 месяца. Но это было довольно удивительно. – Snickers3192

+0

Я знаю, что Swing на самом деле не современный подход, и он убирает угол, но пока это единственная инфраструктура gui, которую я могу использовать. Может быть, в один прекрасный день он изменится. Многопоточность Я не собираюсь говорить то же, что и вы. Он может не использоваться, как раньше, но он по-прежнему является отличной функцией, потому что вы можете сделать некоторые вещи, которые иначе не могли бы. Спасибо! – nervousDev

0

Что вы хотите сделать, это стандартный способ, которым большинство дизайнеров захочет это сделать, то есть иметь класс рабочего класса, который не зависит от GUI.

Создание класса, MySwingWorker, который расширяет SwingWorker и который вызывает, ваши фоновые классы являются стандартным подходом. Возможно, вам понадобится создать один или несколько диалоговых классов для переноса вашего использования MySwingWorkers в зависимости от сложности вашего приложения.

+0

Поскольку я добавляю к вопросу, фоновые задачи должны работать все время для начала, поэтому GUI (SwingWorker) не может этого сделать. Это не относится к одной операции в фоновом режиме. Спасибо. – nervousDev

+0

На самом деле SwingWorker может разместить это с помощью метода publish(), но тогда вам понадобится класс интерфейса между вашим фоновым методом и классом, содержащим SwingWorker, - и тогда вам нужно будет разработать метод их синхронизации (когда вызывать публикацию ()). См. Больше здесь: https://docs.oracle.com/javase/tutorial/uiswing/concurrency/interim.html – Jool

+0

Для того, что я мог видеть в быстром поиске, я думаю, что собираюсь пойти с вариантом дизайна eventbus. Просто потому, что я действительно ненавижу кодировать «из графического интерфейса» даже при разделении слоев. Благодарю вас. Я проверю вам ссылку. – nervousDev

Смежные вопросы