Вернуть метод, когда ограничение по времени истекло - Java

1

Я только начал изучать программирование (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(), но я полностью потерял о том, как его использовать (я читал что-то о многопоточности, но я просто не понимаю, что это такое), я был бы невероятно благодарен, если бы кто-то мог мне помочь! благодаря

  • 3
    2 недели программирования и вы пытаетесь собрать приложение с потоками?
  • 0
    Многопоточность разбивает только на одно предложение возможность одновременного выполнения нескольких заданий. Например, запустив поиск файла, пока вы можете что-то сделать с приложением, например, переименовать файл.
Показать ещё 3 комментария
Теги:

2 ответа

1
Лучший ответ

Учитывая такую функцию, как 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), тогда вы можете использовать операционную систему чтобы убить процесс, если он не завершился после таймаута.

При возврате этого процесса частичный результат будет сложным. Он может периодически отправлять "незавершенное производство" в вызывающий процесс по каналу или периодически сохранять работу в файл.

  • 0
    Метод getPlaceArmiesMove на самом деле содержит более 600 строк Fors и If, поэтому я не думаю, что «доверие функции» поможет мне, я попробую что-то в этом роде. Если у вас есть хороший учебник или руководство по темам в Java, я возьму его! Большое спасибо за ваш ответ
  • 0
    Я добавил ссылку, показывающую, как проверить, не прервана ли ваша тема. Вы все еще должны доверять своей функции, хотя.
0

Используйте пакет Java Timer, однако это потребует от вас понимания таких понятий, как потоки и переопределение метода. Тем не менее, если это то, что вам нужно, ответ очень похож на этот вопрос. Как установить таймер в java

Ещё вопросы

Сообщество Overcoder
Наверх
Меню