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

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

Ответ 1

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

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

Java Concurrency на практике

Попробуйте получить копию Java Concurrency в Практике.


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

java.util.concurrent

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

Исполнители

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

Очереди

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

Timing

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

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

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

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

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


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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Parallelism представил этот путь на уровне языка, в отличие от потоковых librairies, которые предоставляют API-доступ к концепции аппаратного уровня, делает многоядерное программирование намного проще и интуитивно понятным.

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

Ответ 5

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

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

Вы также можете использовать 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 к ExecutorService - когда использовать, который?