2012-05-22 2 views
1
for(int i = 1; i < 10000; i++) { 
Command nextCommand = getNextCommandToExecute(); 
} 

Я хочу запустить вышеуказанную программу на 60 минут. Поэтому вместо того, цикл мне нужно сделать что-то как-Запуск Java для определенного времени времени

long startTime = System.nanoTime(); 

    do{ 
    Command nextCommand = getNextCommandToExecute(); 
    } while (durationOfTime is 60 minutes); 

Но я не уверен, как я должен сделать эту программу для запуска на 60 miniutes.

+0

Сделать нить. – jn1kk

+0

Можете ли вы показать мне один пример с помощью ThreadPoolExecutor? – AKIWEB

+0

просто рассчитать разность между начальным и текущим временем перед каждым испытанием условия. – usoban

ответ

1

попробуйте следующее:

long startTime = System.currentTimeMillis(); 
long endTime = startTime + (60*60*1000); 

while(System.currentTimeMillis() <= endTime) { 
    Command nextCommand = getNextCommandToExecute(); 
} 

Одним из недостатков этого метода является то, если Command вы пытаетесь выполнить пробеги мимо 60 минутный таймер или никогда не заканчивается на всех. Если это поведение недопустимо, вам лучше реализовать поток, который прерывает любой поток, выполняющий этот цикл.

+0

Как я сказал другому человеку: «Что, если это одна непрерывная задача? Вы не получите контроль до тех пор, пока задача не будет выполнена, если когда-либо» – jn1kk

+0

@skynorth Спасибо! Вызывается в редактировании. Может или не может быть проблемой для op, в зависимости от других требований программы. –

4

Запуск фоновый поток, который спит в течение 60 минут и выходов:

Runnable r = new Runnable() { 
    @Override 
    public void run() { 
     try { 
      Thread.sleep(60 * 60 * 1000L); 
     } 
     catch (InterruptedException e) { 
      // ignore: we'll exit anyway 
     } 
     System.exit(0); 
    } 
} 
new Thread(r).start(); 
<your original code here> 
+0

Итак, в этом случае, когда я буду выполнять свою команду, как если бы вы заглянули в мой пример, мне нужно выполнить некоторые задачи, и через 60 минут я хочу остановить программу. – AKIWEB

+0

См. Мое редактирование. Вы запускаете поток перед выполнением исходного кода. –

+0

Обратите внимание, что с помощью этого метода ваша окончательная команда может быть убита в середине ее выполнения. Если вы проанализируете какой-либо вывод, вы, вероятно, захотите опустить последнюю команду, поскольку она будет неполной. – Thomas

2
long startTime = System.currentTimeMillis(); 
do 
{ 
    //stuff 
} while (System.currentTimeMillis() - startTime < 1000*60*60); 
+0

Как я сказал другому человеку: «Что, если это одна непрерывная задача? Вы не получите контроль до тех пор, пока не будет выполнена задание, если когда-либо» – jn1kk

0

Вы могли бы использовать:

long startTime = System.nanoTime(); 
do { 
    Command nextCommand = getNextCommandToExecute(); 
} while ((System.nanoTime() - startTime) < 60 * 60 * 1000000000L); 

Пожалуйста, обратите внимание, System.nanoTime() немного отличается от использования System.currentTimeMillis() не только в а также в том, что он измеряет: System.nanoTime() - прошедшее время, а System.currentTimeMillis() - системное время (настенные часы). Если системное время изменяется, System.currentTimeMillis() не работает должным образом. (Это не относится к летнему изменению, так как возвращаемое значение равно UTC/GMT.)

1000000000L Насекомые - одна секунда. Обратите внимание: L за long. В Java 7 вы также можете написать более читаемый 1_000_000_000L.

+0

Как я сказал другому человеку: «Что, если это один непрерывная задача? Вы не получите контроль до тех пор, пока задача не будет выполнена, если когда-либо « – jn1kk

+0

возможно, getNextCommandToExecute() блокирует, поэтому, если нет команд, программа не будет отключена. Также пустой бесконечный цикл - плохая идея. Попробуйте использовать 'Thread.sleep (60 * 60000L)' в фоновом потоке – alaster

+1

. Вышеприведенный код является ответом на исходный вопрос. Вопрос (по крайней мере, первоначально) заключался не в создании нового потока или выполнении вещей в фоновом режиме, а в том, что если getNextCommandToExecute() блокирует или нет. –

0
long startTime = System.currentTimeMillis(); 

do{ 
Command nextCommand = getNextCommandToExecute(); 
}while (startTime < startTime+60*60*1000); 
Смежные вопросы