Я не хороший программист Java, это - просто мое хобби, но я стремлюсь знать больше, чем средний материал.
Я хочу решить математическую проблему с несколькими потоками в Java. моя математическая проблема может быть разделена на единицы работы, которые я хочу решить в нескольких потоках.
но я не хочу иметь установленную сумму потоков, работающих над ним, но вместо этого соответствующей суммы потоков на сумму ядер CPU. и моя проблема, что я не мог найти легкое учебное руководство в Интернете для этого. все, что я нашел, является примерами с фиксированными потоками.
Таким образом, Вы могли помочь мне со ссылкой на хороший tuturial или могли дать мне легкий и хороший пример? Это было бы действительно хорошо :)
Можно определить количество процессов, доступных виртуальной машине Java, используя статический метод Runtime, availableProcessors. После определения количества доступных процессоров создайте это количество потоков и разделите работу соответствующим образом.
Обновление: Для дальнейшего пояснения, Тема - это просто объект в Java, так что вы можете создать его так же, как вы бы создали любой другой объект. Итак, допустим, вы вызываете вышеприведенный метод и обнаруживаете, что он возвращает 2 процессора. Потрясающе. Теперь вы можете создать цикл, который генерирует новую Тему, и разбивает работу для этого потока, и выстреливает из него. Вот небольшой psuedocode, чтобы продемонстрировать, что я имею в виду:
int processors = Runtime.getRuntime().availableProcessors();
for(int i=0; i < processors; i++) {
Thread yourThread = new AThreadYouCreated();
// You may need to pass in parameters depending on what work you are doing and how you setup your thread.
yourThread.start();
}
Для получения более подробной информации о создании собственного потока, перейдите к данному учебнику . Также вы можете посмотреть на Thread Pooling для создания потоков.
.В классе Runtime есть метод, который называется availableProcessors(). Вы можете использовать его, чтобы узнать, сколько процессоров у вас есть. Так как Ваша программа привязана к процессору, то, вероятно, Вы захотите иметь (максимум) один поток на каждый доступный процессор.
.Наверное, вы тоже захотите посмотреть на java.util.concurrent фреймворк для этих вещей. Что-то вроде:
ExecutorService e = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
// Do work using something like either
e.execute(new Runnable() {
public void run() {
// do one task
}
});
или
Future<String> future = pool.submit(new Callable<String>() {
public String call() throws Exception {
return null;
}
});
future.get(); // Will block till result available
Это намного приятнее, чем справляться с собственными пулами потоков и т.д.
.] Даг Леа (автор параллельного пакета) имеет данную работу, которая может иметь отношение к делу: []http://gee.cs.oswego.edu/dl/papers/fj.pdf[][
] []Структура Fork Join была добавлена в Java SE 7. Ниже приведены еще несколько ссылок:[
] [][]http://www.ibm.com/developerworks/java/library/j-jtp11137/index.html[]. Статья Брайана Гетца[
] [][]http://www.oracle.com/technetwork/articles/java/fork-join-422606.html[][
]