Подтвердить что ты не робот

Советы по кодированию java-программ в многоядерном сценарии

Кажется, что существует много проблем с мультиячейкой и java. В то время как некоторые люди говорят, что поддержка java не является достаточно хорошим, это определенно кажется областью, на которую можно рассчитывать. Кажется, что many методы для повышения производительности параллельных программ.

Приветствуются любые советы/советы по программированию в многоядерном сценарии.

4b9b3361

Ответ 1

Посмотрите на новые объекты Java concurrency (в java.util.concurrent package), которые были добавлены в Java 5. Он обеспечивает функциональность это более высокий уровень, чем обычный Thread, который упростит (и будет меньше подвержен ошибкам) ​​писать параллельные приложения. Урок: Concurrency Учебники по Java будут хорошее место для начала.

До сих пор я использовал ExecutorService, что позволяет создавать пулы потоков, на которые могут быть переданы новые задачи в единицах Runnable или Callable (который может возвращать значения после выполнения как Future s), и фактический код резьбы обрабатывается ExecutorService.

Например, выполнение некоторых вычислений с использованием пула потоков из 2 потоков, и получение результата может быть таким же простым, как:

ExecutorService es = Executors.newFixedThreadPool(2);

Future f1 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Future f2 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Integer firstInteger = f1.get();
Integer secondInteger = f2.get();

В вышеприведенном (непроверенном) коде все, о чем я должен беспокоиться, заключается в создании пары Callable и submit. на ExecutorService и позже, используя Future для получения результата.

Ловушка, как только вызывается get метод Future, если обработка не завершена, программа остановится до тех пор, пока результат Future не будет восстановлен. Таким образом, в этом примере, даже если результат f2 доступен до f1, программа будет ждать, пока не будет получен результат f1.

С точки зрения материала для чтения, в моем списке книг для покупки скоро будет Java concurrency на практике Брайана Гетца, который появляется часто, когда concurrency в Java воспитывается.

Страница Concurrency Утилиты из документации по Java 5 также содержит дополнительную информацию.

Ответ 2

Лучший совет: получите правильную синхронизацию!

Это может показаться несколько очевидным, но понимание Java Memory Model имеет жизненно важное значение, особенно, как volatile и final работают, как синхронизируется действует как мьютекс и барьер памяти, а затем новые конструкторы java.util.concurrent, а также

Ответ 3

Всегда хороший совет - если большинство ваших классов неизменны, все становится намного проще, так как неизменность устраняет необходимость беспокоиться о блокировках от многих до нескольких проблемных проблем.

Ответ 4

Ознакомьтесь с предстоящей картой fork-join. Структура fork-join позволяет разработчикам добиваться мелкозернистого parallelism на многоядерных архитектурах.

Также вы можете проверить языки на основе JVM, такие как Clojure, которые требуют упростить многоядерное параллельное программирование.

Ответ 5

В качестве альтернативы Java-подход с общей памятью к concurrency вы также можете посмотреть на основе concurrency на основе актера с помощью Scala поверх Java, который обеспечивает более легкую модель для параллельного программирования.

Ответ 7

Вы можете попробовать использовать библиотеку шаблонов parallelism, такую ​​как Skandium для Java. Просто выберите шаблон parallelism, который вы хотите, и заполните отсутствующие крючки.

Некоторые из шаблонов, хранящихся в Skandium, следующие:

  • Мастер-подчиненный: Farm<P,R>(nested);
  • Трубопровод: `Труба (stage1, stage2);
  • Итерация: For<P,R>(nested, i);
  • Условная итерация: While<P,R>(nested, condition);
  • Условное ветвление: If<P,R>(condition, trueCase, falseCase);
  • Снижение карты: Map<P,R>(split, nested, merge);
  • Сокращение карты с помощью различных путей кода: Fork<P,R>(split, nested, merge);
  • Рекурсивное разделение и победа: DaC<P,R>(condition, split, nested, merge);

Все шаблоны могут быть вложенными и объединенными, поэтому вы можете иметь ферму внутри разрыва и завоевания и т.д.

Ответ 8

Лучшая книга с практическими советами была Java Concurrency на практике. Это должно быть прочитано для всех java-программистов, даже тех, кто думает, что они не выполняют параллельное программирование, потому что у java много скрытых потоков в его различных библиотеках (размах приходит в голову, то же самое с сервлетами).

Ответ 9

Мой совет: Поймите модель памяти Java (с JDK 5 и выше). Большинство людей не знают, что синхронизация, изменчивость и окончание имеют дополнительное значение, выходящее за пределы обычной многопоточной области.

Java отлично подходит для multi-cpu и multi-core. Если вы запрограммируете его правильно, и вы инвестируете некоторый мозг, вы получаете высококонкурентную серверную систему для использования 8-ядер, включая много синхронизации и так далее. Мы очень довольны этим... JDK6 лучше, чем JDK5, и все, что ниже, засасывает на машинах с несколькими процессорами.