Как создать задачу, которая выскакивает на метке занятости и может быть отменена при выполнении? - PullRequest
2 голосов
/ 01 мая 2009

Я пишу приложение в Java (1.6), используя Swing. В настоящее время у меня есть JXBusyLabel на JXLayer поверх области содержимого моей программы, выступающей в качестве индикатора занятости. Я хочу предоставить возможность другим, работающим со мной, создать задачу, которая будет отображать метку занятости во время ее выполнения. Уловка в том, что задание должно быть отменяемым. Каков наилучший способ показать желаемую функциональность?

Некоторые идеи, которые я придумал:

  1. Необработанный доступ к setBusy ()
    Это, очевидно, самый простой для меня, но требует, чтобы пользователи знали и понимали проблемы с многопоточностью.
  2. public Future execute (Callable )
    Оборачивает вызываемый объект в FutureValue, который запускается () в отдельном потоке, и возвращает это FutureValue. Тогда возникает вопрос, как отслеживать все сгенерированные FutureValue и как гарантировать, что они могут быть отменены. (например, отмена (true) всегда отменяет)

Я никогда не использовал пакет параллелизма в Java раньше, и он не существовал еще тогда, когда я «изучал» Java. Так что я открыт для совершенно новых и разных способов реализации этой функциональности.

Edit: Уточнение моего вопроса. Я знаю о SwingWorker. Я просто никогда не использовал это. То, что я хочу знать, это:
Учитывая Callable (Java-версия замыкания?) Как я могу:

  1. Вернуть значение call () пользователю без блокировки (думаю, мне нужно использовать Future для этого)
  2. Скажите JXLayer заблокировать (запустить маляр), выполнить поставляемый вызов, а затем разблокировать JXLayer (останавливает маляр)
  3. Убедитесь, что независимо от того, какой поток вызывает мою функцию busyExec (), графический интерфейс остается отзывчивым, а фоновая задача завершается. (ПРИМЕЧАНИЕ: если я возвращаю какой-то объект Future и они вызывают get () в потоке событий, он может / будет блокироваться, и это нормально)

Я думаю, мой главный камень преткновения - как реализовать # 2. Должен ли я выполнить busyExec () новым потоком, который блокирует, пока не выполняются фоновые задачи? Должен ли я попытаться для какой-то очереди. Есть ли объект, который сделает все это для меня уже?

Ответы [ 2 ]

1 голос
/ 01 мая 2009

SwingWorker (Java 6) реализует Future, поэтому кажется, что он имеет возможность отмены задач с помощью cancel метод.

Дополнительная информация о SwingWorker из Учебники по Java :

0 голосов
/ 06 мая 2009

Хорошо. Для тех, кто заинтересован, вот то, что я сейчас использую для реализации своего запроса.

У меня есть метод, который возьмет Callable . Затем он создает FutureTask , который будет возвращен вызывающей стороне как Future . JXBusyLabel и JXLayer должны начать рисовать и заблокировать пользовательский интерфейс. FutureValue и Thread (см. Ниже) помещены в специальный список. Создается Runnable, который: вызывает run () для FutureTask, удаляет FutureValue (и поток) из списка, а если список пуст, разблокирует JXLayer и останавливает JXBusyLabel. Этот Runnable запускается в новом потоке с обычным приоритетом.

Когда пользователь нажимает кнопку отмены. Список повторяется, и задачи FutureTasks все отменяются и удаляются из списка, если они могут быть отменены. Сначала попробуйте отменить (false), затем отменить (true). Если оба эти средства не срабатывают, пользователю выдается предупреждение с вопросом, хотят ли они Thread.stop () выполнить задачу, и объясняется, что это может сделать приложение нестабильным. Если да, остановите () поток, выполняющий задачу. Это может привести к остановке приложения. Во всех случаях пользовательский интерфейс разблокирован.

В документации для других членов команды говорится, что они должны знать, что задание может быть убито. Они не должны вызывать get (), пока isDone () не станет истиной. Им явно говорят, что это в основном заставит их блокировать, пока задача не будет выполнена или отменена. Поэтому они не могут вызвать его из потока рассылки событий.

Другие решения все еще приветствуются

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