¿Java tiene soporte para procesadores multinúcleo / parallel processing?

Sé que ahora que la mayoría de los procesadores tienen dos o más núcleos, la progtwigción multinúcleo es furor. ¿Hay alguna funcionalidad para utilizar esto en Java? Sé que Java tiene una clase Thread, pero también sé que esto fue por mucho tiempo antes de que las multicores se hicieran populares. Si puedo hacer uso de múltiples núcleos en Java, ¿qué clase / técnica usaría?

¿Java tiene soporte para procesadores multinúcleo / parallel processing?

Sí. También ha sido una plataforma para otros lenguajes de progtwigción donde la implementación agregaba un punto de venta “verdadero multihilo” o “enhebrado real”. El G1 Garbage Collector presentado en versiones más recientes también hace uso de hardware multi-core.

Concurrencia de Java en la práctica

Intente obtener una copia del libro Java Concurrency in Practice .


Si puedo hacer uso de múltiples núcleos en Java, ¿qué clase / técnica usaría?

java.util.concurrent

Clases de utilidad comúnmente útiles en progtwigción concurrente . Este paquete incluye algunos pequeños marcos extensibles estandarizados, así como algunas clases que proporcionan una funcionalidad útil y son tediosas o difíciles de implementar. Aquí hay una breve descripción de los componentes principales.

Ejecutores

Executor es una interfaz estandarizada simple para definir subsistemas tipo subprocesos personalizados, incluidos grupos de subprocesos, IO asincrónico y marcos de tareas ligeros.

Colas

La clase ConcurrentLinkedQueue java.util.concurrent proporciona una cola FIFO estable y no bloqueable, segura y sin locking.

Sincronización

La clase TimeUnit proporciona múltiples granularidades (incluidos nanosegundos) para especificar y controlar las operaciones basadas en tiempo de espera. La mayoría de las clases en el paquete contienen operaciones basadas en tiempo de espera además de esperas indefinidas.

Sincronizadores

Cuatro clases ayudan a los modismos de sincronización de propósito especial comunes. Semaphore es una herramienta clásica de simultaneidad. CountDownLatch es una utilidad muy simple pero muy común para bloquear hasta que se cumpla un número determinado de señales, eventos o condiciones. […]

Colecciones concurrentes

Además de Colas, este paquete proporciona algunas implementaciones de Colección diseñadas para su uso en contextos multiproceso: ConcurrentHashMap , CopyOnWriteArrayList y CopyOnWriteArraySet .


Esto también es útil si quiere hacer coincidir el número de subprocesos con la cantidad de CPU disponibles, por ejemplo:

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

En la mayoría de las implementaciones de Java, puede confiar en que los hilos de Java son hilos de sistema operativo reales. Como resultado, el sistema operativo se encargará de asegurarse de que la carga de trabajo se distribuya entre múltiples núcleos si utiliza la clase Thread.

Los hilos del sistema operativo son anteriores a los sistemas multinúcleo básicos por mucho tiempo, por lo que no es realmente una preocupación. La única diferencia que hacían los sistemas multinúcleo era permitir que los subprocesos del sistema operativo multiplexados por tiempo se ejecutaran como subprocesos verdaderamente concurrentes en múltiples núcleos.

Java 5 introdujo el paquete java.util.concurrent que ayuda a crear aplicaciones concurrentes que pueden beneficiarse de los sistemas multinúcleo. Este paquete va más allá de la funcionalidad de subprocesamiento múltiple ofrecida en Java 1.4 y versiones anteriores (como sincronización, espera, notificación, etc.).

Hay una propuesta para que Java 7 incluya el marco Fork / Join para hacer más fácil el uso de sistemas multinúcleo.

Encontrará una nueva funcionalidad en Ateji PX, una extensión del lenguaje Java con primitivas paralelas inspiradas en pi-calculus. Muy diferente de la progtwigción de subprocesos y todo basado en subprocesos (tareas, ejecutores, etc.).

El paralelismo presentado de esta manera en el nivel del lenguaje, en lugar de enhebrar librairies que proporcionan acceso de API a un concepto principalmente de nivel de hardware, hace que la progtwigción multinúcleo sea mucho más simple e intuitiva.

Es un enfoque radicalmente nuevo para la progtwigción paralela de la que vale la pena leer (descargo de responsabilidad: yo soy el diseñador de Ateji PX). El documento técnico está aquí: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf .

Sí. Java proporciona una API concurrente para aprovechar las ventajas de los procesadores multi-core de la máquina.

Puede obtener el conteo de procesadores disponible desde Runtime y usar ese conteo para crear ExecutorService a través de muchas API en los ejecutores .

También puede usar la API ThreadPoolExecutor para lograr lo mismo.

Java 8 proporciona una API más: newWorkStealingPool, que crea ForkJoinPool mediante el uso de todos los procesadores disponibles. No es necesario pasar el recuento del procesador como parámetro.

Eche un vistazo a la muestra al código:

 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); 

Eche un vistazo a la pregunta SE relacionada Ejecutor:

Tenedor de Java / Join vs ExecutorService – cuándo usar cuál?