Отмена SwingWorker с ThreadPoolExecutor

Я согласен с вами, что хорошо написанный код не нуждается в каких-либо комментариях, так как «Код - это только хорошая документация, доступная программисту. Однако это очень идеальное условие, не все пишут хороший код все время. Поэтому, чтобы сделать плохо написанный код хорошим в Будущие комментарии необходимы.

1
задан MrWhite 17 June 2009 в 16:46
поделиться

4 ответа

Одним из способов создания однопоточного ThreadPoolExecutor, который выполняет только последний входящий Runnable, является подкласс подходящего класса очереди и переопределение всех методов добавления для очистки очереди перед добавлением нового runnable. Затем установите эту очередь как рабочую очередь ThreadPoolExecutor.

2
ответ дан 3 September 2019 в 01:23
поделиться

Зачем вам нужен ThreadPoolExecutor для этого вид работы?

Сколько у вас источников различных SwingWorkers? Потому что, если источник всего один, вы должны использовать другой подход.

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

0
ответ дан 3 September 2019 в 01:23
поделиться

Не могли бы вы вместо использования SwingWorker использовать ThreadPoolExecutor для выполнения взаимодействия клиент-сервер, а затем вызвать SwingUtilities.invokeLater для обновления пользовательского интерфейса с результатом? Мне это кажется немного более понятным и гарантирует, что события и обновления пользовательского интерфейса будут по-прежнему обрабатываться по порядку.

Когда вы отправляете задачи своему исполнителю, вы можете сохранить ссылку на их экземпляры Future, чтобы при необходимости отменить задачу.

0
ответ дан 3 September 2019 в 01:23
поделиться

Посмотрим, правильно ли я понимаю проблему. У вас есть очередь задач FIFO, только самая старая из которых работает. По завершении каждой задачи необходимо обновить пользовательский интерфейс. Но если наступает определенное пользовательское событие, все задачи необходимо отменить, то есть отменить выполняемые задачи, а еще не запущенные задачи нужно удалить из очереди. Правильно?

Предполагая, что это так, я бы не стал использовать SwingWorker , поскольку вам нужен только один рабочий поток, а не один для каждой задачи. FutureTask должно быть достаточно (при условии, что вы переопределите done () , чтобы сделать необходимый вызов SwingUtilities.invokeLater () и выполнить обновление пользовательского интерфейса).

Если вы отмените FutureTask , то даже если его метод run () будет вызван, он ничего не сделает. Таким образом, вы можете безопасно отправить FutureTask в ExecutorService , зная, что отмена будет работать, даже если исполнитель попытается запустить их.

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

Я исправил приведенный ниже код всего за час и не стал бы ставить на то, что он правильный, но идею вы поняли. :

0
ответ дан 3 September 2019 в 01:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: