• 1000 затем остановитесь и напечатайте их значение счетчика, а также время, которое потребовалось потоку для завершения выполнения той части, которая мне небезразлична. Вот мой код:
public static void main(String []args){
for(int j=0;j<200;j++){
final int x = j;
new Thread(()->{
System.out.println("start " + x);
try{Thread.sleep(500);}catch(Exception e){}//this lets all the threads be created before running any calculations
long a = System.nanoTime();
for(int i=0;i<1000000000;i++){
}
long b = System.nanoTime();
System.out.println("stop " + x + " : " + ((b-a))/1000000000.0);//outputs time in seconds
}).start();
}
}
Странно то, что когда j
, количество созданных потоков низкое (обычно <50), результат выглядит так, как я считаю нормальным - вот пример с 6 потоками: </p>
start 3
start 1
start 4
start 5
start 0
start 2
stop 5 : 0.0035043
stop 1 : 0.0034917
stop 4 : 0.0035097
stop 2 : 0.004224
stop 0 : 0.0025082
stop 3 : 0.004472
Обратите внимание на то, что все времена больше 0,003. Однако, когда создается много потоков, появляется "нормальное" время (аналогично приведенному выше), но большая часть, как правило, дает время порядка 10 ^ -5 - вот фрагмент вывода:
stop 49 : 1.09E-5
stop 13 : 2.81E-5
stop 2 : 1.98E-5
stop 18 : 6.4E-6
stop 19 : 0.0616381
stop 7 : 0.0575055
stop 14 : 0.0648309
У меня вопрос - как это возможно, чтобы по мере добавления большего количества потоков время их выполнения становилось короче? Разве это не логично, что при добавлении большего количества выполняемых потоков все они в среднем должны занимать больше времени? Я почти уверен, что это не проблема волатильности - каждый поток должен иметь возможность касаться только данных, относящихся к самому себе. Шестиядерный процессор с тактовой частотой 4 ГГц и 17+ ГБ ОЗУ