Действительно ли возможно остановить выполнение функции в течение требуемого времени в Java?

Я хочу знать, как остановить выполнение указанной функции в течение требуемого времени в Java.

Например: Я могу вызвать функцию, вызванную print_data (). Если требуется больше времени для выполнения, я должен буду остановить выполнение той функции.

Действительно ли возможно остановить выполнение как это?

Заранее спасибо

5
задан bragboy 6 July 2010 в 05:35
поделиться

3 ответа

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

Это самый простой способ решить такую ​​задачу на Java.

4
ответ дан 14 December 2019 в 01:01
поделиться

Вы можете использовать перечисление TimeUnit enum из java.util.concurrent , в частности метод timedJoin .

Вы указываете время ожидания и поток. timedJoin позволит вашему потоку выполняться до завершения или остановится, если обработка займет больше времени, чем разрешено тайм-аутом. Вы можете использовать анонимный класс, чтобы легко обернуть ваш метод в объект Thread .

Это может быть очень просто:

SECONDS.timedJoin(
    new Thread() {
      public void run() {
        print_data();
      }
    },
    10);    

для 10-секундного тайм-аута.

2
ответ дан 14 December 2019 в 01:01
поделиться

Не существует безопасного способа остановить выполнение потока, если только он не ведет себя кооперативно; например, регулярно проверяет флаг 'interrupted'.

@BobbyShaftoe предлагает следующее в комментарии:

Вы могли бы выполнить эту функцию в отдельном потоке, а затем прервать поток через некоторое время.

Это вводящий в заблуждение и опасный совет. Единственный способ "прервать" поток - это использовать устаревший метод Thread.stop(). Если вы посмотрите на javadoc для этого метода, то увидите, что это принципиально опасный метод, который может иметь нежелательные и непредсказуемые побочные эффекты.

Следует также отметить, что решение @tonio не останавливает выполнение функции. Оно просто прекращает ожидание завершения выполнения функции. Функция может продолжать выполняться бесконечно, пожирая ресурсы без всякой пользы.

3
ответ дан 14 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: