2013-04-14 2 views
1

Я читал, например, в Java Concurrency in Practice, что «программа с одним потоком может работать не более одного процессора за раз».Один поток java использует оба ядра на Mac?

Однако, если я запускаю однопоточный Java-класс на своем Intel Core 2 Duo Macbook Pro с частотой 2,5 ГГц, я могу видеть (в Activity Monitor), что использование ЦП увеличивается с 0 до 60% на ядрах BOTH ,

Является ли Mac OS каким-то образом переключает поток от одного ядра к другому, и если да, то почему?

Спасибо! Вот код ..

public class PrimeCalculator { 

    public static void findPrimes (int start, int end){ 
     int countPrimes = 0; 
     for (int i=start; i<end; i++){ 
      if (i % 1000000 == 0){ 
       System.out.println("Did a million.."); 
      } 
      boolean found = true; 
      for (int check = 2; check <= Math.sqrt(i); check++){ 
       if (i % check == 0){ 
        found = false; 
        break; 
       } 
      } 
      if (found == true){ 
       //System.out.println(i); 
       countPrimes++; 
      } 
     } 
     System.out.println("I counted "+countPrimes+" primes"); 
    } 

    public static void main(String[] args){ 
     findPrimes(0,100000000); 
    } 
} 
+1

Я бы оптимизировал 'Math.sqrt (i)', чтобы сохранить его на каждой итерации. Скорее всего, что нить переключается между ядрами (используя 50% или каждый), и есть немного дополнительной работы на машине, доведя ее до 60%. –

+0

Спасибо за ваш комментарий, Питер. Мой вопрос более простой, чем ваш комментарий. Я просто спрашиваю, почему Mac не запускает этот поток на одном ядре? (Программа - это просто демоверсия, показывающая, что она становится разделенной на две части). Если она действительно способна распределить нагрузку на две части, то почему в книгах с параллелизмом говорится, что вам нужно несколько потоков для распространения нагрузки на обработку? – Bruce

+1

Он работает на 100% на одном ядре, а затем 100% на другом ядре, составляющем в среднем 50% на каждом. (60% с некоторыми накладными расходами) Чтобы использовать оба ядра одновременно, а не только со временем, вам нужно несколько потоков. –

ответ

2

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

Может быть, вы можете найти еще некоторую информацию здесь: Why does a single threaded process execute on several processors/cores?

+0

Ah - отличная ссылка. Спасибо, да - это отлично отвечает на мой вопрос .. – Bruce

1

Вы можете использовать jstack команду, чтобы увидеть поведение потока. Не забывайте, что Java также создает много потоков в фоновом режиме - пример, представляющий собой поток GC, финализатор, диспетчер сигналов и т. Д.

На моем Mac он показывает около 8 потоков - ваш пробег может отличаться. Внедрение ОС и JDK позволяет планировать потоки как и где они хотят!

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