2013-04-28 1 views
0

Существует класс Algorithm, который имеет метод runAlgorithm. В настоящее время он выполняет некоторое предопределенное количество итераций, например. 100 итераций, после чего он останавливается. Этот метод вызывается из класса Test.Запуск метода в течение заданного количества минут

Теперь мне нужно обновить свой код, чтобы иметь возможность запускать метод runAlgorithm в течение заданного количества минут, например. 5 минут, после чего его нужно остановить.

В результате я должен иметь возможность выбирать критерий остановки, то есть время или количество итераций: algorithm.runAlgorithm('time',5) или algorithm.runAlgorithm('iterations',100).

Я не уверен, как это сделать. Должен ли класс Algorithm быть реализован как Runnable? Или мне нужно создать таймер в классе Test? Руководство будет высоко оценено.

public class Test {            

public static void main(String[] args) 
{ 

    init(); 

    Algorithm algorithm = new Algorithm(); 

    // 5 minutes is a stopping criterion for the algorithm 
    Solution solution = algorithm.runAlgorithm('time',5); 

    System.out.println(solution); 

} 

} 
+0

@ syb0rg: Я хочу, чтобы метод runAlgorithm запустить определенное количество миллисекунд. Итак, время как критерий остановки для алгоритма. Например, если я укажу 5 минут в качестве критерия остановки, алгоритм должен быть запущен 5 минут. Через 5 минут (это может означать, например, 133 итерации) он должен предоставить решения. –

ответ

2

Из исходного утверждения 100 итераций Я предполагаю, что runAlgorithm - это в основном цикл. Учитывая, что, вы бы просто изменить цикл следующим образом:

public Solution runAlgorithm(String method, int duration) 
    Solution solution = null; 
    if (method.equals("time") { 
     long start = System.currentTimeMillis(); 
     while (true) { 
      if (System.currentTimeMillis() - start > duration) { 
       break; 
      } 
      // do stuff 
     } 
    } 
    else { 
     for (int iter = 0; iter < 100; iter++) { 
      // do stuff 
     } 
    } 
    return solution; 
} 
0

Проверьте Guava library'sTimeLimiter, который производит прокси, которые налагают ограничение по времени на вызовы методов проксируемым объекта.

ИЛИ

Можете ли вы попробовать это?

private Solution runAlgorithm(String criterion, long minutes) { 
    Solution solution = null;  
    if(criterion!=null && criterion.equalsIgnoreCase("time")){ 
     long startTime = System.currentTimeMillis(); 
     long endTime = startTime + minutes*60*1000; 
     while (System.currentTimeMillis() < endTime) 
     { 
      // your code 
     } 
    } 
    else { 
      // run 100 iterations 
    } 
      return solution; 
    } 
+0

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

+0

Отредактировал свой ответ. Проверь это! – NINCOMPOOP

0
while(!Thread.currentThread().isInterrupted()){ 
    for(i=1;i<100;i++){ 

     if(i==100){ 

      Thread.currentThread().interrupt(); 

      break; 
     } 
     try { 
      Thread.sleep(600); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

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

+0

вы можете установить итерации, которые хотите, и время, которое я здесь установил 1min –

+0

В этом случае, где мне нужно вставить algorithm.runAlgorithm? Или вы имеете в виду, что этот поток должен быть реализован внутри метода runAlgorithm? –

+0

вы можете поместить алгоритм.runAlgorithm в цикл внутри этого цикла, чтобы так захотелось его итерации, и вы можете использовать if-else, если для его запуска для определенного номера, если время скажет, если i = 1 -> алгоритм вызова.runAlgorithm снова используйте, если i = 2 ... i = 5 алгоритм вызова.runAlgorithm он будет работать в 5 раз и установить метод сна, чтобы потребовалось время, с которым можно было бы использовать, если aslo –

-1

Вы можете использовать либо таймер Java, или в другое время с Явой (т. Е Форма Таймеры).

См. Here Для получения дополнительной информации об этом!

+0

Ответы должны быть более существенными, чем в основном просто ссылка на другие статьи или ответы StackOverflow. Если вы обнаружите, что другой вопрос + вопрос + описывает ту же ситуацию, что и вопрос, напишите ссылку на него в качестве комментария к вопросу. –

0
while(!Thread.currentThread().isInterrupted()){ 
for(i=1;i<100;i++){ 
    if(i==1){ 
    //call your method 
    //use sleep (optional) 
    } 

    if(i==2){ 
    //call your method 
    //use sleep (optional) 
    } 
    . 
    . 
     . 
    if(i==5){ 
    //call your method 
    //use sleep (optional) 
    } 
    if(i==100){ 

     Thread.currentThread().interrupt(); 

     break; 
    } 
    try { 
     Thread.sleep(600); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Thread2.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

}

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

  • Нет связанных вопросов^_^