Я только начал изучать программирование (2 недели назад), и я пытаюсь сделать бота для игры. В основном классе бота есть 3 метода, которые необходимо вернуть в течение 2 секунд или он вернет значение null. Я хочу избежать возврата null и вернуть то, что он подсчитал за 2 секунды.
public ArrayList<PlaceArmiesMove> getPlaceArmiesMoves(BotState state, Long timeOut){
ArrayList<PlaceArmiesMove> placeArmiesMoves = new ArrayList<PlaceArmiesMove>();
// caculations filling the ArrayList
return placeArmiesMoves;
}
то, что я хочу сделать, это через 2 секунды, возвращая placeArmiesMoves, если метод закончен или нет. Я прочитал о guava SimpleTimeLimiter и callWithTimeout(), но я полностью потерял о том, как его использовать (я читал что-то о многопоточности, но я просто не понимаю, что это такое), я был бы невероятно благодарен, если бы кто-то мог мне помочь! благодаря
Учитывая такую функцию, как getPlaceArmiesMove
, существует несколько методов, которые вы могли бы использовать для привязки времени выполнения.
Если функция запускает цикл, на каждой итерации она может проверять, истекло ли время.
long startTime = System.currentTimeMillis()
for (;;) {
// do some work
long elapsed = System.currentTimeMillis() - startTime;
if (elapsed >= timeOut) {
break;
}
}
Этот метод прост, но нет гарантии, что он будет завершен до таймаута; это зависит от функции и того, насколько вы можете выполнять работу (конечно, если она слишком гранулированная, вы будете проводить больше времени, если истечет время ожидания, чем на самом деле работает).
Я не знаком с Guava, но это похоже на то, что делает SimpleTimeLimiter. В Java, как правило, невозможно принудительно остановить поток, хотя можно игнорировать поток после таймаута (функция будет выполняться до завершения, но вы уже использовали ее частичный результат и игнорируете полный результат, который приходит слишком поздно). Гуава говорит, что он прерывает поток, если он не вернулся до таймаута. Это работает только в том случае, если ваша функция проверяет, была ли она прервана, как техника "доверяйте своей функции".
См. Этот ответ для примера о том, как проверить, был ли прерван поток. Обратите внимание, что некоторые Java-методы (например, Thread.sleep
) могут Thread.sleep
InterruptedException
если поток прерывается.
В конце концов, проверки на isInterrupted()
опрыскивания isInterrupted()
всей вашей функции не будут сильно отличаться, чем ручные проверки тайм-аута. Поэтому, работая в потоке, вы все равно должны доверять своей функции, но для такого рода вещей могут быть лучшие помощники (например, Guava).
Пример того, как это сделать, остается как упражнение, но если вы запускаете свою функцию в отдельном процессе (или потоке на языках, поддерживающих принудительную остановку потоков, например, Erlang, Ruby, others), тогда вы можете использовать операционную систему чтобы убить процесс, если он не завершился после таймаута.
При возврате этого процесса частичный результат будет сложным. Он может периодически отправлять "незавершенное производство" в вызывающий процесс по каналу или периодически сохранять работу в файл.
Используйте пакет Java Timer, однако это потребует от вас понимания таких понятий, как потоки и переопределение метода. Тем не менее, если это то, что вам нужно, ответ очень похож на этот вопрос. Как установить таймер в java