2013-08-05 2 views
1

Я думаю, что этот вопрос был поднят несколько раз в прошлом, но это немного отличается, и я не мог найти подходящий ответ нигде.
У меня есть поток, который вызывает (внутри run()) другую рекурсивную функцию. На самом деле это игровой движок, а рекурсивная функция - MiniMax.
Проблема в том, что когда пользователь хочет уйти в отставку в середине вычисления или даже отменить ход, то как мне остановить эту функцию?Остановка рекурсивной функции в JAVA (изнутри потока)

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

Как остановить такую ​​функцию?

+1

Функция 'Minimax' является только двоичной? У вас нет источника? Действительно, это эта функция (рекурсивная или нет), которая должна быть опроса на каком-то флаге, чтобы определить, следует ли продолжать или отказаться от ее работы. –

+0

У меня возникли проблемы с полным пониманием ситуации. Можете ли вы опубликовать фрагмент, удалив ненужный код? –

+1

Невозможно. Либо проверьте 'boolean' на каждом рекурсивном шаге. Или, лучше, проверьте флаг прерывания в потоке на каждом шаге. –

ответ

0

Вызов Thread.interrupt() будет вызывать InterruptedException при любом вызове wait() или sleep(), который вы вызываете из процесса потока, также не забудьте проверить isInterrupted() на «не делать ничего».

Когда InterrupedException выбрасывается из режима ожидания/ожидания (или соединения), прерванный статус очищается, а вызов isInterruped() возвращает false, поэтому не забудьте прерывать() поток после исключения.

Кроме того, с использованием boolean прервано() вместо isInterrupted() очищает прерванный статус, а двойная проверка с прерыванием может привести к следующему действию false, если не прерывается снова между вызовами.

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

1

Это решение действительно создает проблему, не слишком изящную, но довольно творческую. Я нашел его в исходном коде инструкции junit FailOnTimeout. То, что они делают, это обернуть Callable в FutureTask, а затем запустить его с помощью потока. Затем они вызывают FutureTask.get(long timeout, TimeUnit unit), который возвращает результат или выбрасывает TimeoutException, если timeoutunits прошло и позволяет потоку работать столько, сколько захочет. Я думаю, что эту же идею можно использовать и здесь.

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