Si usted puede dividir su acción intensiva a recursivas sub tareas más pequeñas, ForkJoinPool es ideal para usted.
Si el servidor se está ejecutando con 8 core CPU
, se puede ajustar el tamaño de la piscina como 8
ForkJoinPool forkJoinPool = new ForkJoinPool(8);
O
puede utilizar Executor ServiceFixedThreadPool
moviendo tarea intensiva de cómputo a Callable
como a continuación
ExecutorService executorService = Executors.newFixedThreadPool(8);
Future future = executorService.submit(new Runnable() {
public void run() {
System.out.println("Your compute intensive task");
}
});
future.get(); //returns null if the task has finished correctly.
Hay una ventaja con ForkJoinPool
. Los subprocesos inactivos robarán trabajos de subprocesos activos de blokcingQueue donde se hayan enviado las tareas Runnable/Callable
.
Java 8 añade una más nueva API en Executors
: newWorkStealingPool
Si es necesario esperar a la finalización de todas las tareas, el uso puede utilizar invokeAll()
en ExecutorService
.
Tener un vistazo a este article por Benjamin
concurrentes para las API avanzadas utilizando Java 8
El "gran guía" a esto es el excelente libro [Java concurrencia en la práctica] (http://www.javaconcurrencyinpractice.com/), por Brian Goetz et al. –
http://download.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html The Fork/Join Framework está construido para ese caso (y otros, también :-). Advertencia: solo JDK7. – helpermethod
BTW ¿Alguien sabe por qué Oracle pone enlaces JDK7 en el tutorial mucho antes de que esté disponible una versión de lanzamiento de JDK7? –