Java: Как масштабировать потоки согласно ядрам CPU?

Я не хороший программист Java, это - просто мое хобби, но я стремлюсь знать больше, чем средний материал.

Я хочу решить математическую проблему с несколькими потоками в Java. моя математическая проблема может быть разделена на единицы работы, которые я хочу решить в нескольких потоках.

но я не хочу иметь установленную сумму потоков, работающих над ним, но вместо этого соответствующей суммы потоков на сумму ядер CPU. и моя проблема, что я не мог найти легкое учебное руководство в Интернете для этого. все, что я нашел, является примерами с фиксированными потоками.

Таким образом, Вы могли помочь мне со ссылкой на хороший tuturial или могли дать мне легкий и хороший пример? Это было бы действительно хорошо :)

101
задан Steve Kuo 9 June 2014 в 15:48
поделиться

4 ответа

Можно определить количество процессов, доступных виртуальной машине 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 для создания потоков.

.
114
ответ дан 24 November 2019 в 04:41
поделиться

В классе Runtime есть метод, который называется availableProcessors(). Вы можете использовать его, чтобы узнать, сколько процессоров у вас есть. Так как Ваша программа привязана к процессору, то, вероятно, Вы захотите иметь (максимум) один поток на каждый доступный процессор.

.
3
ответ дан 24 November 2019 в 04:41
поделиться

Наверное, вы тоже захотите посмотреть на 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

Это намного приятнее, чем справляться с собственными пулами потоков и т.д.

.
62
ответ дан 24 November 2019 в 04:41
поделиться
[

] Даг Леа (автор параллельного пакета) имеет данную работу, которая может иметь отношение к делу: []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[][

]
8
ответ дан 24 November 2019 в 04:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: