2013-09-02 13 views
0

Этот код работает отлично:Бесконечный цикл

public class Main { 

    public static void main(String[] args) { 
     long startTime = System.currentTimeMillis(); 
     long endTime = startTime + 60000; 
     long index = 0; 

     while (true) { 
      double x = Math.sqrt(index); 
      long now = System.currentTimeMillis(); 
      if (now > endTime) { 
       break; 
      } 

      index++; 
     } 
     System.out.println(index + " loops in one minute."); 
    } 
} 

Но тогда, я попытался переписать его в for loop, и он застревает в бесконечном цикле.

public class Main { 

    public static void main(String[] args) { 
     long startTime = System.currentTimeMillis(); 
     long endTime = startTime + 60000; 

     int i = 0; 
     for (long now = 0; now < endTime; i++) { 
      Math.sqrt(i); 
      now = System.currentTimeMillis(); 
      System.out.println("now" + now); 
      System.out.println("end" + endTime); 
     } 
    } 

    System.out.println(i+"calculations done in one minute"); 
} 
+0

Вы возвращаете значение 'now' внутри вашего цикла. Итак, 'now' всегда будет меньше, чем' endTime'. – Jbird

+0

Как ваш второй метод подходит для компиляции? Это 'System.out' вне любого метода. – Makoto

+2

Это не бесконечный цикл, подождите 1 минуту. –

ответ

3

Ваш второй пример - это не бесконечный цикл, просто подождите 1 минуту.

long endTime = startTime + 60000; 

установить EndTime 60000 миллисекунд в будущем, что означает 60 секунд, означает 1 минуту.

Стандартный выход - это просто печать очень быстро.

Вставьте петлю Thread.sleep(1000L), и вы увидите, что перед печатью будет напечатано 61 оператор.

long endTime = 1378140843604L; // for example 
for (long now = 0; now < endTime; i++) { 
    now = System.currentTimeMillis(); // will be 1378140783604, 1378140784604, 1378140785604 and so on 
    System.out.println("now" + now); 
    System.out.println("end" + endTime); 
    Thread.sleep(1000L); 
} 
0

Это работает для меня:

public class Main { 

public static void main(String[] args) { 
    long startTime = System.currentTimeMillis(); 
    long endTime = startTime + 60000; 

    int i = 0; 
    for (long now = 0; now < endTime; i++) { 
     Math.sqrt(i); 
     now = System.currentTimeMillis(); 
     System.out.println("now" + now); 
     System.out.println("end" + endTime); 
    } 

    System.out.println(i+"calculations done in one minute"); 
} 
} 

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

System.out.println(i+"calculations done in one minute"); 

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