Вы можете определить количество процессов, доступных виртуальной машине Java, с помощью статического метода времени выполнения, availableProcessors . После того, как вы определили количество доступных процессоров, создайте это количество потоков и соответственно разделите свою работу.
Обновление : чтобы уточнить, поток - это просто объект в Java, поэтому вы можете создать его так же, как и любой другой объект. Итак, допустим, вы вызываете вышеуказанный метод и обнаруживаете, что он возвращает 2 процессора. Потрясающие. Теперь вы можете создать цикл, который генерирует новый поток, разделяет работу для этого потока и запускает поток. Вот какой-то псевдокод, чтобы продемонстрировать, что я имею в виду:
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();
}
Для получения дополнительной информации о создании собственной темы перейдите к этому руководству . Кроме того, вы можете посмотреть пул потоков для создания потоков.
Вы, вероятно, захотите также посмотреть на фреймворк java.util.concurrent для этого. Что-то вроде:
или
Это намного лучше, чем иметь дело с собственными пулами потоков и т. Д.
источник
Опция 1:
newWorkStealingPool из
Executors
С этим API вам не нужно передавать количество ядер
ExecutorService
.Реализация этого API из grepcode
Вариант 2:
newFixedThreadPool API из
Executors
илиother newXXX constructors
, который возвращаетExecutorService
замените nThreads на
Runtime.getRuntime().availableProcessors()
Вариант 3:
ThreadPoolExecutor
передать
Runtime.getRuntime().availableProcessors()
как параметр вmaximumPoolSize
.источник
У Дуга Ли (автора параллельного пакета) есть эта статья, которая может иметь отношение к делу: 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
источник
Стандартный способ - это метод Runtime.getRuntime (). AvailableProcessors (). На большинстве стандартных процессоров вы вернете здесь оптимальное количество потоков (которое не является фактическим количеством ядер процессора). Следовательно, это то, что вы ищете.
Пример:
НЕ забудьте закрыть службу-исполнитель следующим образом (иначе ваша программа не выйдет):
Вот лишь краткое описание того, как настроить будущий MT-код (оффтоп, для иллюстрации):
Затем вам нужно отслеживать, сколько результатов вы ожидаете, и получать их следующим образом:
источник
В классе Runtime есть метод с именем availableProcessors (). Вы можете использовать это, чтобы выяснить, сколько у вас процессоров. Поскольку ваша программа привязана к ЦП, вы, вероятно, захотите иметь (максимум) один поток на доступный ЦП.
источник