Java SwingWorker Socket Server не отменяется, когда я отменяю SwingWorker - PullRequest
1 голос
/ 08 июня 2011

Я получил Socket Server, работающий как Java SwingWorker.

SwingWorker получает входящие соединения и при соединении передает сокет Исполнителю, который заботится о соединении.Executor вызывает SocketHandler, который будет обрабатывать сокет с помощью метода run ().

Теперь у меня есть одна кнопка в графическом интерфейсе, которая говорит стоп.Я хочу остановить выполнение SwingWorker при нажатии кнопки «Стоп».Для этого у меня был метод cancel (true), вызываемый после нажатия кнопки Stop.

Теперь SocketHandler продолжает получать входящие данные, несмотря на то, что моя программа вызывает метод cancel (true).Что здесь происходит?

Я прочитал через пару статей, что в JDK есть ошибка, что вызов метода cancel (true) не останавливает SwingWorker.Это правда?

Ответы [ 3 ]

4 голосов
/ 08 июня 2011

просто добавьте логическую проверку в цикле

if (!stillWorking)return;

, затем вы можете установить логическое значение false, чтобы остановить метод.

3 голосов
/ 08 июня 2011

API для public final boolean cancel(boolean mayInterruptIfRunning):

"mayInterruptIfRunning - true, если поток, выполняющий эту задачу, должен быть прерван; в противном случае выполняемым задачам разрешается завершать".

Вы должны прочитать на Thread.interrupt.Это на самом деле ничего не прерывает;Вы должны указать в своем коде, как обращаться с прерываниями.

Кроме того, из вашего вопроса не ясно, хотите ли вы просто остановить основной SwingWorker от принятия соединений или если вы хотите уничтожить все существующие соединениятоже.

РЕДАКТИРОВАТЬ: Если у вас в потоке есть петля while, принимающая соединения:

while (!Thread.interrupted()) {

должно быть достаточно, я думаю.Теперь, когда SwingWorker отменен, цикл должен остановиться, потому что для потока SwingWorker установлен флаг внутреннего прерывания.

2 голосов
/ 08 июня 2011

@ Yakult121, пожалуйста, это не ответ на оба ваших вопроса Сервер сокетов Java SwingWorker не отменяется, когда я отменяю SwingWorker и Java SwingWorker - использование публикации / процесса для обновления TextAreaв EDT? , я думаю, что ваш вопрос не полностью описан, я пропускаю много важных деталей,

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

ваш код может быть основан также на этих двух потоках

1 / Отмена SwingWorker

2 / Executor And SwingWorker

3 / и как / что вы определяете конкретную нить SwingWorker для отмены

4 / действительно соедините ваши две нити

...