2013-12-03 2 views
2

Итак, STB является двухъядерным. Я думал, что мы можем создать только 2 подходящих потока.Сколько потоков Java может быть создано для двухъядерного процессора

В каждом keyreleased()

Я создаю новый поток

Runnable runnable = new Runnable() 
{ 
    int i = j; 

    public void run() 
    { 
     while (true) 
     { 
      System.out.println("This thread is running always number is " + i); 
     } 
    } 
}; 

Thread th = new Thread(runnable); 
      th.setPriority(Thread.MAX_PRIORITY); 
      th.start(); 

j++; 
//... 
} 

Но даже после создания более 20 потоков, коробка не имеет каких-либо проблем.

Это потому, что JVM понял, что пусковой блок пуст, и он оптимизировал код? Или реализация JVM для while (true) отличается?

Примечание: я попробовал положить Thread.sleep (1000), а также, но никаких проблем

ответ

6

Вы можете запустить 20 потоков даже на одноядерном компьютере. То, что происходит, называется срезом времени.

http://en.wikipedia.org/wiki/Time_slice#Time_slice

Это способ для процессора для имитации нескольких процессоров выполнять множество задач, как когда-то.

+0

как насчет времени (правда)? Не означает, что while (true) полностью блокирует поток. – Gerrard

+0

В то время как (правда) почти не имеет значения; вы вызываете sleep(). Попробуйте удалить вызов для сна, тогда вы увидите истинное воздействие непрерывного бесконечного цикла. –

+0

Моя первая попытка была явно без сна. Мое понимание заключается в том, что сон будет содержать поток. Java doc говорит sleep. Заставляет текущий исполняемый поток спать (временно прекратить выполнение) за указанное количество миллисекунд, с учетом точности и точности системных таймеров и планировщиков. Нить не теряет права собственности на какие-либо мониторы. – Gerrard

1

Нити не привязаны к физическим или логическим процессорным ядрам. Операционная система управляет потоками в части, называемой планировщиком. В основном каждый поток получает определенное количество времени для работы на ядре процессора, затем он приостанавливается, а следующий поток имеет время для запуска, через некоторое время первый поток снова запускает время.

3

Количество возможных потоков не имеет ничего общего с ядрами ЦП. Это скорее функция доступной памяти. Для каждого потока требуется отдельный стек, поэтому в зависимости от размера стека число ограничено.

Например, попробуйте:

java -Xss8m -Xmx64m ..... 

Вы, вероятно, заметили, что вы не можете создать, что многие темы.

2

Короткий ответ: вы можете продолжать создавать пользовательские потоки, пока ваш JVM/OS не сможет обработать больше.

Длинный ответ: цитата из другого ответа я дал this question:

Термин нити обычно охватывает три уровней абстракции:

  • Пользовательские потоки являются потоки, запускаемые приложениями и сопоставляются N: M до:
  • Нити ядра, которые являются потоками, управляемыми операционной системой, отображаются N: M по:
  • Связанные темы, которые являются фактическими физическими ресурсами.

Что вы создаете в своем приложении - это темы пользователей. Как вы можете видеть, многие пользовательские потоки могут отображать меньшее количество аппаратных потоков (фактическое количество параллельных потоков, с которыми может работать аппаратное обеспечение, в данном случае 2).

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

+0

Hi Tudor, Что произойдет, если я положу весь этот код в течение (истинного) цикла. Согласно вашему объяснению, это не имеет никакого значения? – Gerrard

+0

@Jeril Kuruvila: Это не повлияет на то, что у вас достаточно ОЗУ для создания потоков, и планировщик не задушит слишком много потоков. 20 нитей не должно быть проблемой. – Tudor

+0

Итак, есть проблема с вашим ответом. Ящик работает, и он создает потоки, но не отвечает на клавиши. Раньше без верхнего уровня (правда) он работал нормально. Можете ли вы объяснить это поведение? Примечание. Теперь создаются тысячи потоков. Мой комментарий - не бороться с вашим ценным ответом. – Gerrard

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