Остановка/прерывание операции

У меня есть проект Java, который анализирует html-страницу с помощью JSoup и записывает некоторые даты в электронную таблицу Excel (файл .xls).

Во фрейме есть кнопка «Остановить операцию», поэтому пользователь может остановить задачу, но кнопка не работает, пока не закончится синтаксический анализ/запись. «Кнопка X» в кадре имеет такое же поведение.

Может ли кто-нибудь помочь мне решить эту проблему?


person eclipse    schedule 05.10.2015    source источник
comment
Как вы сейчас пытаетесь это остановить?   -  person Evan Knowles    schedule 05.10.2015
comment
Это довольно широкий вопрос. Что вы пробовали?   -  person daiscog    schedule 05.10.2015
comment
1. Пожалуйста, не пишите в заголовке на Java. Достаточно, когда он помечен как Java. 2. Что вы уже пробовали? Какие источники вы пробовали?   -  person Jannik    schedule 05.10.2015


Ответы (2)


Вы должны поместить все операции синтаксического анализа и записи во внешний поток, а затем прервать поток, если пользователь нажмет кнопку «Остановить операцию».

Вот пример того, как вы можете использовать прерывание потока: http://www.tutorialspoint.com/javaexamples/thread_interrupt.htm

person javatutorial    schedule 05.10.2015
comment
Если внешний поток не работает, например. поскольку операцию нельзя прервать, вам нужно будет поместить ее в другой процесс, который вы можете убить. - person Peter Lawrey; 05.10.2015
comment
Однако прерывание потока не обязательно приводит к каким-либо действиям; вам нужно будет реализовать логику в этом потоке, чтобы соответствующим образом справиться с прерыванием. - person Andy Turner; 05.10.2015
comment
Использование Thread.currentThread().isInterrupted() не очень надежно, так как есть много вещей, которые могут очистить прерванный статус потока. Лучше использовать флаг volatile boolean, который рабочий метод должен периодически проверять, чтобы убедиться, что он должен остановиться. - person daiscog; 05.10.2015
comment
Ты прав. Конечно, использование изменчивого логического значения, чтобы спросить, можно ли прервать поток, кажется хорошей альтернативой для чистого кода. И, конечно же, прерываемый поток должен реализовать некоторую логику для обработки прерывания. Но это показано довольно ясно в связанном примере. - person javatutorial; 05.10.2015
comment
@javatutorial Связанный пример ужасен. Метод work2 войдет в блок if только после того, как поток будет прерван (если, вероятно, должно быть if ( ! Thread.currentThread().isInterrupted() ) — обратите внимание на !). До тех пор он просто сидит в напряженном ожидании, постоянно проходя через while (true). - person daiscog; 05.10.2015
comment
Верно. Но он показывает, как обрабатывать прерывания потоков и InterruptedExceptions, и это было то, что нужно OP. Пример не является приложением, но он может быть полезен. Всем привет, мир? ;) - person javatutorial; 05.10.2015

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

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

Убедитесь, что вы не попали в ловушку использования Thread.stop() для этого, что устарело, и на то есть веские причины. Вы должны убедиться, что ваш рабочий поток взаимодействует с основным потоком, чтобы остановиться, когда его попросят.

person chiastic-security    schedule 05.10.2015