Java 7 - Fork/Join
-
Upload
zenika -
Category
Technology
-
view
6.835 -
download
2
description
Transcript of Java 7 - Fork/Join
- 1.
2. Zenika
- Zenikaest un cabinet de conseil en architecture informatique.
3. 3 domaines d'expertise centrs sur la plate-forme Java.
- La formation
Centre de formation au coeur de Paris. Spring, Hibernate, Maven, Eclipse RCP, BIRT, GWT, etc...
-
- Le conseil
Audits de code et d'architecture, prconisations et mise en place de frameworks, choix et valuation d'outils et de frameworks, etc...
-
- La ralisation
Approche pragmatique de nos architectes - nous ralisons ce que nous prconisons. Dlgation de projets au forfait. 4. Speakers
- Lucien Pereira Consultant Zenika
- Benot Nouyrigat Consultant Zenika
- Olivier Croisier Consultant Zenika
5. Plan
- Introduction
6. Le framework Fork / Join 7. Use-cases et bonnes pratiques 8. Dmos 9. Conclusion 10. Introduction Java 7
- Premire version majeure depuis2006
11. Premire version dirige par Oracle 12. Contenu:
- Project Coin
13. NIO2 14. Fork / Join 15. InvokeDynamic 16. Autres En attendant Java 8... 17. Introduction Pourquoi Fork / Join
- Les processeurs multiples sont omniprsents
- Desktops, Laptops, Tablettes, Tlphones!
Il faut en tirer parti
- Programmation multi-threade
18. Algorithmes parallles Design patterns parallles
- Fork / Join = Map / Reduce
Frameworks
- Hadoop, GridGain...
19. Introduction Principe du Fork / Join
- Un problme doit tre trait.Il est modlis sous la forme d'une tche soumise un pool de threads
20. Cette tche
- Constate que le problme peut tre dcompos en sous-problmes indpendants, donc paralllisables
21. Cre une nouvelle tche par sous-problme 22. Les soumet au pool en appelant fork() 23. Attend leur compltion en appelant join() 24. Fusionne les rsultats partiels 25. Renvoie le rsultat final 26. Le framework Fork / Join ForkJoinPool
- Packagejava.util.concurrent
27. Famille desExecutors T invoke(task) void execute(task) Future submit(task) < interface> Executor < interface> ExecutorService ForkJoinPool 28. Le framework Fork / Join ForkJoinPool
- Instanciation
- new ForkJoinPool([int nbThreads]);
29. Par dfautnbThreads= nombre de processeurs 30. ThreadFactory et UncaughtExceptionHandler rglables Utilisation private static ForkJoinPool pool =new ForkJoinPool() ; public void sort(long[] array) { pool.invoke (new ArraySortTask(...)); } 31. Le framework Fork / Join ForkJoinPool TASK 32. Le framework Fork / Join ForkJoinTask
- UnForkJoinPoolexcute desForkJoinTasks
compute(), fork(), join() isDone(), get() ... < interface> Future < abstract> ForkJoinTask RecursiveTask RecursiveAction 33. Le framework Fork / Join ForkJoinTask
- RecursiveTask
- ImplmenteFuture
34. Modlise un traitement rcursif qui renvoie une valeur
- Ex: calculer la taille totale d'une arborescence de fichiers
RecursiveAction
- ImplmenteFuture
35. Modlise un traitement qui ne renvoie pas de valeur 36. Peut nanmoins modifier les donnes passes en paramtre
- Ex: trier un tableau "in-place"
37. Le framework Fork / Join RecursiveTask
- RecursiveTask
fork fork fork join join join fork join fork join fork join +1 +1 +1 +1 +1 +1 1 2 3 4 +1 2 3 4 5 1 2 2 3 3 4 4 5 1 2 2 3 3 4 4 5 38. Le framework Fork / Join RecursiveTask - Mauvais exemple public class FileSizeTask extends RecursiveTask { private File root; public FileSizeTask(File root) { this.root = root; } protected Long compute() { long size = 0; File[] files = root.listFiles(); for (File f : files) { if (f.isDirectory()) { ForkJoinTask subtask =new FileSizeTask(f).fork() ; size +=subtask.join() ; }else { size += f.length(); } }return size; } } 39. Le framework Fork / Join RecursiveTask - Bon exemple public class FileSizeTask extends RecursiveTask { private File root; public FileSizeTask(File root) { this.root = root; } protected Long compute() { List>subTasks= new ArrayList(); long size = 0; File[] files = root.listFiles(); for(File f : files) { if (f.isDirectory()) { subTasks.add(new FileSizeTask(f).fork()) ; }else { size += f.length(); } } for (ForkJoinTask subTask : subTasks) { size += subTask.join(); } return size; } } // 40. Le framework Fork / Join RecursiveAction
- RecursiveAction
fork join fork join fork fork join join join fork join fork +1 +1 1 2 3 4 2 3 4 5 1 2 3 4 +1 1 2 3 4 2 2 3 4 +1 1 2 3 4 1 3 3 4 +1 1 2 3 4 1 2 4 4 +1 1 2 3 4 1 2 3 5 2 3 3 4 +1 1 2 3 4 1 2 4 5 41. Use-cases et bonnes pratiques Use-cases
- Le design pattern Fork / Join est adapt:
- En environnement multi-processeurs
42. Lorsque le traitement est dcomposable ensous-tchesindpendantes
- Existence d'algorithmes parallles spcifiques
La dcomposition en sous-tches peut tre:
- statique: dcouper un tableau en zones fixes
43. dynamique: dcouvrir une arborescence de fichiers
- Attention matriser le volume de tchescres !
44. Use-cases et bonnes pratiques Bonnes pratiques
- Attention au cot de gestion
- Le bnfice obtenu en paralllisant un traitementdoit tre suprieur au cot de gestion par le framework
45. Trouver la bonne granularit Attention la consommation mmoire
- Grosses structures: prfrer la modification "in-place"
46. Dcouverte dynamique des sous-tches Attention la complexit
- Optimisation prmature?
47. Maintenance 48. Use-cases et bonnes pratiques Optimisations
- Framework Fork / Join
- "Work stealing"
49. Threads >= Degr de paralllisme
- Les tches en attente dejoin()sont mises de ctpour permettre d'autres tches d'tre traites
Tches
- Eviter la synchronisation manuelle
- Utiliserfork()etjoin()uniquement
Optimiser la granularit l'aide des statistiques du pool
- getQueuedSubmissionCount() ,getStealCount() ...
50. Possibilit d'optimisation dynamique 51. Dmos! 52. Rfrences
- API Java 7, package java.util.concurrent http://download.java.net/jdk7/docs/api/
53. Etude de Doug Lea http://gee.cs.oswego.edu/dl/papers/fj.pdf 54. Article de Julien Ponge http://www.oracle.com/technetwork/articles/java/fork-join-422606.html 55. Article de Jos Paumard http://blog.paumard.org/2011/07/05/java-7-fork-join/ 56. Questions ?