2012-03-22 3 views
1

Я делаю поиск дерева игр с альфа-бета-обрезкой в ​​игре, подобной шашкам, но мне дается строгий 5-секундный предел для определения моего лучшего хода. Я хотел бы, чтобы моя рекурсия попала в базовый регистр прямо до того, как будет выделено время.Как закончить рекурсию через определенное количество времени в Java?

Как я могу проверить, сколько у меня осталось времени или, возможно, изменить логическое значение, когда мое время почти закончено?

+0

просто идея. Возьмите статическую переменную и используйте в соответствии с вашими требованиями. –

+0

Есть ли встроенный класс java, который вы бы рекомендовали использовать для отслеживания времени? Как вы его реализуете? Кроме того, спасибо за ответ –

ответ

0

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

0

Вы можете создать новый поток, который будет отсчитываться, и через 5 секунд изменить логическое значение, которое можно проверить из другого места. Что-то вроде этого может быть?

Executors.newCachedThreadPool().execute(new Runnable() { 
        public void run() { 
          Thread.sleep(5000); 
          timeout = true; 
}}); 
+0

Итак, я бы инициализировал тайм-аут как ложный, запустил это право до того, как я начну свое расторжение, а затем проверить, действительно ли это в моем базовом случае? –

+0

Вы это сработаете. Думаю, решение от @dldnh тоже будет работать. – Giannis

+0

ОК спасибо человеку! –

0

Существует несколько способов сделать это. Как было предложено в других сообщениях, вы можете использовать System.currentTimeMillis() и проверять его на переменную long startTime, которую вы передаете через рекурсивный вызов, или каким-либо иным образом доступным для рекурсивной функции по мере ее выполнения. Или вы можете использовать Runnable или Callable, чтобы перевернуть флаг или запустить обратный вызов после 5000ms sleep(), но я думаю, что это может быть излишним.

Последний раз я сделал что-то вроде этого, я использовал Guava class называется StopWatch, который обеспечивает хороший метод, называемый elapsedMillis(), который дает вам количество истекших миллисекунд, так как вы начали свой StopWatch. Этот подход больше всего похож на System.currentTimeMillis(), но требует немного меньше плиты котла. Если введение Guava в качестве зависимости не является вариантом, то вы всегда можете реализовать аналогичный класс самостоятельно, который под капотом будет просто использовать System.currentTimeMillis() в любом случае.

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