Есть ли в Java поддержка многоядерных процессоров / параллельной обработки? - PullRequest
35 голосов
/ 25 июля 2010

Я знаю, что теперь, когда у большинства процессоров есть два или более ядер, многоядерное программирование стало модным явлением. Есть ли функциональность, чтобы использовать это в Java? Я знаю, что в Java есть класс Thread, но я также знаю, что прошло много времени, прежде чем многоядерные технологии стали популярными. Если бы я мог использовать несколько ядер в Java, какой класс / метод я бы использовал?

Ответы [ 5 ]

41 голосов
/ 25 июля 2010

Есть ли в Java поддержка многоядерных Процессоры / параллельная обработка?

Да. Он также был платформой для других языков программирования, где реализация добавила «истинную многопоточность» или «реальную многопоточность». G1 Garbage Collector , представленный в более новых версиях, также использует многоядерное оборудование.

Java-параллелизм на практике

Попробуйте получить копию Java-параллелизма на практике книги.


Если я смогу использовать несколько ядер в Ява, какой класс / техника я бы использовать?

java.util.concurrent

Утилиты обычно полезны в параллельное программирование . Этот пакет включает в себя несколько небольших стандартизированных расширяемые рамки, а также некоторые классы, которые предоставляют полезные функциональность и другие утомительно или сложно реализовать. Вот краткие описания Основные компоненты.

Исполнители

Executor - это простой стандартизированный интерфейс для определения пользовательских нитевидных подсистем, в том числе пулов потоков, асинхронного ввода-вывода и облегченных сред задач.

Очередь

Класс java.util.concurrent ConcurrentLinkedQueue предоставляет эффективную масштабируемую неблокируемую неблокирующую очередь FIFO.

Сроки

Класс TimeUnit предоставляет множество гранулярностей (включая наносекунды) для задания и управления операциями на основе времени ожидания. Большинство классов в пакете содержат операции, основанные на тайм-аутах в дополнение к неопределенному ожиданию.

Синхронизаторы

Четыре класса помогают распространенным идиомам синхронизации специального назначения. Semaphore - классический инструмент параллелизма. CountDownLatch - очень простая, но очень распространенная утилита для блокировки до тех пор, пока не будет выполнено заданное количество сигналов, событий или условий. [...]

Параллельные коллекции

Помимо очередей, этот пакет предоставляет несколько реализаций Collection, разработанных для использования в многопоточных контекстах: ConcurrentHashMap, CopyOnWriteArrayList и CopyOnWriteArraySet.


Это также удобно, если вы хотите сопоставить количество потоков с количеством доступных процессоров, например:

int n = Runtime.getRuntime().availableProcessors();
9 голосов
/ 25 июля 2010

В большинстве реализаций Java вы можете полагаться на потоки Java, являющиеся реальными потоками ОС.В результате операционная система позаботится о том, чтобы рабочая нагрузка распределялась по нескольким ядрам, если вы используете класс Thread.

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

7 голосов
/ 25 июля 2010

Java 5 представила пакет java.util.concurrent, который помогает создавать параллельные приложения, которые могут использовать многоядерные системы. Этот пакет выходит далеко за рамки многопоточной функциональности, предлагаемой в Java 1.4 и более ранних версиях (например, синхронизированный, ожидание, уведомление и т. Д.).

В Java 7 есть предложение включить фреймворк Fork / Join , чтобы упростить использование многоядерных систем.

2 голосов
/ 28 июля 2010

Вы найдете новую функциональность в Ateji PX, расширении языка Java с параллельными примитивами, созданными на основе pi-calculus. Совсем отличается от программирования потоков и всего, что основано на потоках (Задачи, Исполнители и т. Д.).

Параллелизм, введенный таким образом на уровне языка, в отличие от многопоточных библиотек, которые предоставляют доступ API к концепции, в основном аппаратного уровня, делает многоядерное программирование намного проще и интуитивнее.

Это принципиально новый подход к параллельному программированию, о котором стоит прочитать (отказ от ответственности: я являюсь разработчиком Ateji PX). Технический документ здесь: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf.

0 голосов
/ 11 мая 2016

Да. Java предоставляет параллельный API , чтобы использовать преимущества многоядерных процессоров машины.

Вы можете получить количество доступных процессоров из среды выполнения и использовать его для создания ExecutorService через множество API в Исполнители .

Вы также можете использовать ThreadPoolExecutor API для достижения того же.

Java 8 предоставляет еще один API: newWorkStealingPool, который создает ForkJoinPool с использованием всех доступных процессоров. Вам не нужно передавать количество процессоров в качестве параметра.

Посмотрите на образец кода:

int processorCount = Runtime.getRuntime().availableProcessors();

ExecutorService executor1 = Executors.newFixedThreadPool(processorCount);
ExecutorService executor2 =  
                            Executors.newScheduledThreadPool(processorCount);
ExecutorService executor3 = Executors.newWorkStealingPool(); // java-8 API
ForkJoinPool forkJoinPool = new ForkJoinPool(processorCount);

Посмотрите на соответствующий вопрос SE правильно Исполнитель:

Служба Java Fork / Join vs ExecutorService - когда и какую использовать?

...