¿Puede alguien explicar qué es Fork/Join?Java 7: Fork/Join Framework
Respuesta
Digamos que tiene una colección de cosas que necesitan ser procesados. Tienes varios hilos que pueden tomar subconjuntos de esta colección y procesarlos. Todos hacen esto concurrentemente (la parte de la horquilla) y luego esperan en la última para terminar (la parte de la unión) antes de regresar.
Con el priviso que el padre actual _restaura ejecutando_ hasta que todos los trabajadores concurrentes terminen, y _then_ reanuda. Sé que esto fue inherente a su descripción, pero creo que vale la pena ser muy explícito porque eso es todo lo que realmente hace que esto difiera de cualquier otro tipo de paralelismo explícito. – Gian
Bueno, no es una carga de operaciones, realice todas y luego únase. Es un enfoque de dividir y vencer. –
Fork Join es un nuevo marco que tiene una API más fácil de usar para un algoritmo paralelo, dividir y conquistar.
Digamos que tiene una tarea larga que, para esta instancia, tiene un algoritmo complicado. Querrá dividir las tareas grandes y ahora trabajar en esas dos tareas. Ahora digamos que esas dos tareas son todavía demasiado grandes, dividiría cada una en dos tareas (en este punto hay cuatro).
Continuará esto hasta que cada tarea tenga un tamaño aceptable e invoque el algoritmo. Es importante saber que la invocación de cada tarea se realiza en paralelo. Cuando la tarea se completa, se une con la otra tarea con la que se bifurcó y consolida los resultados.
Esto continuará hasta que todas las tareas se hayan unido y se haya devuelto una tarea.
Además de lo que ya se ha dicho, fork/join utiliza robo de trabajo: los hilos que se quedan sin cosas que hacer pueden robar tareas de otros hilos que todavía están ocupados. Y aquí es un ejemplo que puede ayudar a entender cómo FJ se puede utilizar:
public class SumCounter extends RecursiveTask<Long> {
private final Node node;
public SumCounter(Node node) {
this.node = node;
}
@Override
protected Long compute() {
long sum = node.getValue();
List<ValueSumCounter> subTasks = new LinkedList<>();
for(Node child : node.getChildren()) {
SumCounter task = new SumCounter(child);
task.fork(); // run asynchronously
subTasks.add(task);
}
for(SumCounter task : subTasks) {
sum += task.join(); // wait for the result
}
return sum;
}
public static void main(String[] args) {
Node root = getRootNode();
new ForkJoinPool().invoke(new SumCounter(root));
}
}
este es un muy buen recurso para entender Tenedor y unirse a:
Fork and Join: Java Can Excel at Painless Parallel Programming Too! Por Julien Ponge
Let simplemente pongo mis dos centavos para hacer que la comprensión básica de Fork/Join sea simple.
What is Fork/Join?
The fork/join framework is an implementation of the ExecutorService interface
that helps you take advantage of multiple processors. It is designed for work
that can be broken into smaller pieces recursively. The goal is to use all the
available processing power to enhance the performance of your application.
- Este marco es muy útil para el modelado de divide y vencerás problemas. Este enfoque es adecuado para tareas que se pueden dividir de forma recursiva y se pueden calcular en una escala menor; los resultados calculados son y luego combinados.
- El marco es una implementación de la interfaz ExecutorService y proporciona una plataforma simultánea fácil de usar para explotar procesadores múltiples.
término útil para este marco
- bifurca: Dividir la tarea en tareas más pequeñas se bifurcan.
- Unión: La fusión de los resultados de las tareas más pequeñas se une a
Como con cualquier aplicación ExecutorService, el tenedor/unirse marco distribuye tareas a los subprocesos de trabajo en un grupo de subprocesos. El marco fork/join es distinto porque utiliza un algoritmo de robo de trabajo. Los subprocesos de trabajo que se quedan sin cosas que hacer pueden robar tareas de otros subprocesos que todavía están ocupados.
El Tenedor/Join algoritmo está diseñado de la siguiente manera:
- tareas divididas
- tenedor las tareas
- unirse a las tareas
- componer los resultados
doRecursiveTask(input){ if(task is small enough to handled by a thread){ compute the small task; if there is result to return, then do so }else{ divide the task i.e, fork() into two parts call compute on first task, join on second task, combine both results and return } }
¿Qué es el algoritmo de robo de trabajo?
Cada subproceso de trabajo en el Tenedor/Join marco tiene una cola de trabajo, que se implementa utilizando un deque. Cada vez que se crea una nueva tarea (o subtarea) , se lleva al encabezado de su propia cola. Cuando una tarea completa una tarea y ejecuta una unión con otra tarea que no está completada, , funciona de manera inteligente. El hilo muestra una nueva tarea desde el encabezado de su cola y comienza a ejecutarse en lugar de suspender (en orden para esperar a que se complete otra tarea). De hecho, si la cola de un subproceso está vacía, el subproceso muestra una tarea desde el final de la cola que pertenece a otro subproceso. Esto no es más que un algoritmo de robo de trabajo. More detail is here
- 1. ClassValue en Java 7
- 2. Cierres en Java 7
- 3. Java 7 - líneas múltiples
- 4. Tomcat6 y Java 7
- 5. Compilación de Java 7 a Java 6
- 6. Java Script Collection Framework
- 7. framework Java HA
- 8. Java Security Framework
- 9. Play framework 1.2.4 La precompilación de PROD falla con Java 7
- 10. Invocación encadenada en Java 7?
- 11. ProGuard + Maven con Java 7
- 12. IntelliJ, Maven y Java 7
- 13. cambio compilador de Java 7
- 14. Implementación Files.size() en Java 7
- 15. Cierre ResultSet en Java 7
- 16. Maven no utiliza Java 7
- 17. controlador JDBC para Java 7
- 18. Java 7 "optimización" de clasificación
- 19. Binario Java 7 para Mac
- 20. setDragImage no funciona - Java 7
- 21. Eclipse 3.5 y Java 7
- 22. Java 7 fecha/hora API
- 23. ¿Tomcat 7 ahora es compatible con Java 7?
- 24. ¿Dónde está GACUTIL para .NET Framework 4.0 en Windows 7?
- 25. Java Framework for Database operations
- 26. Java 7 64 bit en Windows 7: cómo cambiar las versiones java
- 27. Java 7 de 32 bits de Windows 7 - Webstart Java - No se puede cargar recursos
- 28. framework de blog basado en Java framework - Apache Roller?
- 29. Java 7/compilable James bond ASCII art
- 30. ¿Java 7 SE tiene soporte para EJB?
he tratado de explicar en profundidad aquí: [Java: utilizando el Tenedor/Join Marco para la resolución paralela de divide y vencerás problemas] (http://www.davismol.net/2016/ 01/24/java-using-the-forkjoin-framework-for-the-parallel-resolution-of-divide-and-conquer-problems /) –