В программе, над которой я работаю, я хочу, чтобы пользователь мог вводить количество потоков обработки, которые имеет их процессор, чтобы программа могла разделить рабочую нагрузку (она делает общие вычисления) между количеством потоков, компьютер есть.Как создать определенное пользователем количество потоков?
В качестве альтернативы, есть ли способ, которым вы можете получить программу для определения конфигурации системы, чтобы получить количество потоков без запроса пользователя? Это было бы предпочтительнее, но я не знаю, есть ли способ сделать это.
Вот единственное, о чем я мог думать. Я знаю, что это совершенно неверно, и вы не можете назвать нить таким образом, но я новичок (все еще в старшей школе), и я просто хотел включить что-то, чтобы показать, что я пытаюсь.
for(int i = 0; i < threads; i++) {
Thread thread(i) = new Thread(){
public void run() {
double endNum = 0;
for(double numberRun = 0; numberRun <= calcs/threads; numberRun++){
endNum += (num * 999999999);
}
System.out.println("Thread " + i + " complete! The numerical result of the calculation is " + endNum);
}
};
}
Все, кто не уверен, что я говорю, я пытаюсь создать несколько потоков, что компьютер, иначе количество ядер, или, если он использует Intel, HyperThreading, в два раза количество ядер. У вас может быть больше потоков, чем система может выполнять сразу, но я пытаюсь сделать самую эффективную вещь и делить общее количество вычислений на количество потоков, которые система может выполнять одновременно. Я не знаю, как дать пользователю определить количество потоков, а затем создать это число потоков (или позволить программе определить количество потоков, которые система имеет, а затем создать это число).
Вы проверили это: http://stackoverflow.com/questions/1980832/java-how-to-scale-threads-according-to-cpu-cores – home
Это не имело бы смысла, если вы также не прикололи их к ядро/HT, но даже тогда вы должны знать, что ваши потоки не будут одинокими в современной многозадачной ОС, поэтому в большинстве случаев вам намного лучше позволить планировщику операционной системы решить, что нужно запускать и когда. Это будет неплохо работать, тогда как у вас нет способа узнать, что делают другие потоки в системе, и риск ухудшения производительности, если вы смогли привязать один из ваших потоков к ядру, занятому чем-то другим. – Fredrik
@Fredrik - для задач с интенсивным процессором (и считая, что это единственный или самый распространенный на машине), вы вообще не хотите запускать больше потоков, чем у вас есть процессоры, иначе вы просто создаете конкуренцию. Но вы также не хотите подрезать количество процессоров, потому что вы не будете использовать их все. nCPUIntensiveThreads == nПроцессоры на самом деле довольно справедливая цель. – James