Java 7 - Fork/Join

download Java 7 - Fork/Join

If you can't read please download the document

description

Présentation de Fork/Join dans Java 7 par Olivier Croisier, Benoît Nouyrigat et Lucien Pereira, de Zenika. Cette présentation a été donnée lors d'une fête en l'honneur de la sortie de Java 7, co-organisée par Xebia et Zenika (cf. http://sortiejava7.eventbrite.com ).

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 ?