2011-01-10 8 views
3

hi Я хочу блок кода (определенные строки функции), который будет работать в течение определенного промежутка времени (например, x миллисекунд). Это можно сделать в Ява?java- время выполнения блока кода

+2

Что произойдет после того, как согласованная сумма времени прошло? Сроки? –

ответ

2

первый подход:

long startTime = System.nanoTime(); 
while(System.nanoTime() - startTime < MAX_TIME_IN_NANOSECONDS){ 
    // your code ... 
} 

второй подход

Начните свой код в потоке.

Сон основной нить столько, сколько вам нужно.

Убить (остановить, прервать) вашу нить.

2

либо используют условие выхода на основе текущей метки времени, либо создают отдельный поток и убивают его после указанного таймаута.

+1

+1. Либо сам код должен будет периодически останавливаться, чтобы проверить текущее время, либо другой поток должен будет отслеживать время и отправлять какой-то сигнал kill. –

+0

-1 Мы больше не убиваем темы. –

+0

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

0

Вы можете использовать календарь:

timeInMilis = Calendar.getInstance().getTimeInMillis(); 
while(Calendar.getInstance().getTimeInMilis() - timeInMilis < MAX_TIME_IN_MILIS){ 
    // Execute block 
} 
+0

wow большое спасибо !!! –

0

Проверка времени с помощью System.currentTimeMillis() и выйти свой цикл после того, как прошло время.

 
long endTime = System.currentTimeMillis() + ClassName.EXECUTION_TIME_MS; 
while (System.currentTimeMillis() < endTime) { 
    // do your stuff 
} 

Если вам нужно спать в резьбе по какой-то причине, настроить время сна, чтобы закончить в конце времени.

 
    long timeLeft = endTime - System.currentTimeMillis(); 
    if (sleepAmount > timeLeft) 
    sleepAmount = timeLeft; 
    Thread.sleep(sleepAmount); 

Если вы собираетесь использовать wait() и notify() метод, а затем использовать вычисленный timeLeft в качестве аргумента wait(), чтобы обеспечить максимальное время ожидания. Как только это время ожидания будет достигнуто, метод вернется и цикл разобьется.

 
    long timeLeft = endTime - System.currentTimeMillis(); 
    if (timeLeft > 0) 
    this.wait(timeLeft); 

Если вы работаете в нескольких этапов внутри цикла, который может занять длительное время, необходимо добавить дополнительные проверки между шагами, если вы хотите, чтобы процесс разрыва между шагами, чтобы выйти из цикла, если назначенное время прошел. Это дизайнерское решение. Когда истечет таймер, вы хотите, чтобы задача завершила шаг, над которым он работает, а затем выйти? Это зависит от вас, как закодировать его на основе желаемого результата.

 
long endTime = System.currentTimeMillis() + ClassName.EXECUTION_TIME_MS; 
while (System.currentTimeMillis() < endTime) { 
    this.doFirstLongThing(); 
    if (System.currentTimeMillis() >= endTime) break; 
    this.doSecondLongThing(); 
    if (System.currentTimeMillis() >= endTime) break; 
    this.doThirdLongThing(); 
} 
1

Запустите свой метод в отдельном потоке, но передайте его Исполнителю. Затем вы можете использовать Future, чтобы подождать определенный период времени для завершения потока. Если он не завершен, вы получите исключение TimeoutException, и вы можете отменить поток. Отмена потока приводит к прерыванию потока. Таким образом, ваш код будет периодически проверять состояние прерывания потока и при необходимости выходить.

Например:

ExecutorService exec = Executors.newSingleThreadExecutor(); 
Future<Integer> future = exec.submit(new Callable<Integer>(){ 
    @Override 
    public Integer call() throws Exception { 

     //do some stuff 

     //periodically check if this thread has been interrupted 
     if (Thread.currentThread().isInterrupted()) { 
      return -1; 
     }      

     //do some more stuff 

     //check if interrupted 
     if (Thread.currentThread().isInterrupted()) { 
      return -1; 
     } 

     //... and so on 

     return 0; 
    } 
}); 
exec.shutdown(); 

try { 
    //wait 5 seconds for the task to complete. 
    future.get(5000, TimeUnit.MILLISECONDS); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    e.printStackTrace(); 
} catch (TimeoutException e) { 
    //the task did not complete in 5 seconds 
    e.printStackTrace(); 
    System.out.println("CANCELLING"); 

    //cancel it 
    future.cancel(true); //sends interrupt 
}