Сколько потоков может выполняться на CPU одновременно
Я хочу знать, сколько потоков можно запустить на CPU для одного приложения одновременно?
Я же простой, как:
import java.awt.SystemColor;
import java.util.Date;
public class Threadcall {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
System.out.println("--------------------------");
System.out.println(Runtime.getRuntime().availableProcessors());
System.out.println("--------------------------");
for (int i = 0; i < 5; i++) {
new samplethread(i);
}
// create a new thread
//samplethread1.run();
try {
for (int i = 5; i > 0; i--) {
System.out.println("Main Thread: " + i + "t" + new Date());
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("Main thread interrupted.");
}
System.out.println("Main thread exiting.");
}
}
public class samplethread implements Runnable {
Thread t;
samplethread(int i) {
// Create a new, second thread
t = new Thread(this, Integer.toString(i));
System.out.println("Child thread Creation NO: " + i + "t" + t.getName());
t.start(); // Start the thread
// t.run();
}
@Override
public void run() {
try {
for (int i = 5; i > 0; i--) {
System.out.println("Child Thread Run: " + i + "t" + t.getName() + "t" + new Date());
// Let the thread sleep for a while.
System.out.println("****************************");
Thread.sleep(500);
}
} catch (InterruptedException e) {
System.out.println("Child interrupted.");
}
System.out.println("Exiting child thread.");
}
}
он показывает выход, как:
Номер Процессора: 2
основная нить: 3 ВС 26 мая 19:23: 19 IST 2013
запуск дочерней нити: 1 2 Sun May 26 19:23: 19 IST 2013
запуск дочерней нити: 1 1 Солнце 26 мая 19:23: 19 IST 2013
Запуск Дочерней Нити: 1 3 Sun May 26 19: 23: 19 IST 2013
запуск дочерней нити: 10 ВС 26 мая 19:23: 19 IST 2013
запуск дочерней нити: 1 4 Sun May 26 19:23: 19 IST 2013
из вывода видно, что одновременно могут выполняться пять потоков (я даже печатаю результат в миллисекундах)..........У меня есть два процессора, о которых сообщается в программе.
Как это возможно?
потому что один поток может работать только в одном процессоре за раз, но он показывает, что пять потоки выполняются одновременно.
есть ли способ показать, что только один поток может работать в одном процессоре одновременно.......
Если я изменю свой код, например:
t.start();
t.join();
затем он показывает выход, как:
создание дочернего потока нет: 99 99 Запуск дочерней нити: 5 99 Sun May 26 21:02: 32 IST 2013
запуск дочерней нити: 4 99 Sun May 26 21:02: 32 IST 2013
бег потока ребенка: 3 99 Солнце Май 26 21:02: 33 Ист
запуск дочерней нити: 2 99 Sun May 26 21:02: 33 IST 2013
запуск дочерней нити: 1 99 Sun May 26 21:02: 34 IST 2013
Итак, как возможно, что если я добавлю простую строку в код, то это покажет, что только два потока могут получить доступ к двум процессорам?
1 ответов
зависит от того, что вы подразумеваете под "одновременно."Вы можете иметь бесконечное количество потоков, выполняемых на одном и том же процессоре через переключение, т. е. выполнение одной строки кода из одного потока, а затем переключение на другой, выполнение одной строки кода, а затем переключение обратно. Процессор имитирует "одновременное выполнение", переключаясь взад и вперед очень быстро.
однако большинство процессоров ограничены по количеству поистине синхронный threads они могут выполнение количеству ядер у них, но даже это плохая оценка из-за общих ресурсов и оборудования. Теоретически у вас может быть до 4 одновременных потоков, работающих на 4-ядерном процессоре.