:: Enseignements :: ESIPE :: E4INFO :: 2018-2019 :: Collections Concurrentes ::
[LOGO]

Fork/Join, Continuation


Fork/Join, Continuation

Exercice 1 - ForkJoinCollections

On souhaite implanter une classe ForkJoinCollections permettant de faire un reduce sur n'importe qu'elle collection. Pour parcourir et découper la collection en deux, on utilisera l'interface Spliterator.

On partira du code suivant
public class ForkJoinCollections {
  public static <V, T> V forkJoinReduce(Collection<T> collection,  int threshold, V initialValue,
                                        XXX accumulator, YYY combiner) {
    
    return forkJoinReduce(collection.spliterator(), threshold, initialValue, accumulator, combiner);
  }
  
  private static <V, T> V forkJoinReduce(Spliterator<T> spliterator, int threshold, V initialValue,
                                         XXX accumulator, YYY combiner) {
    // TODO
  }
  
  public static void main(String[] args) {
    // sequential
    System.out.println(IntStream.range(0, 10_000).sum());
    
    // fork/join
    var list = IntStream.range(0, 10_000).boxed().collect(Collectors.toList());
    var result = forkJoinReduce(list, 1_000, 0, (acc, value) -> acc + value, (acc1, acc2) -> acc1 + acc2);
    System.out.println(result); 
  }
}
   

  1. Quel sont les types XXX et YYY ou dit différemment pourquoi on a besoin de deux lambdas an paramètre de forkJoinReduce ?
  2. Implanter la méthode forkJoinReduce en utilisant le common ForkJoinPool ainsi qu'une classe interne héritant de la classe RecursiveTask.
  3. Que peut-on en conclure sur la façon dont les Stream parallèles sont implantés ?

Exercice 2 - Rappel sur les continuations

Nous avons déjà vu le mécanisme de continuation, ceci est un petit rappel.

  1. Créer un nouveau projet dans Eclipse et configurer le projet pour utiliser le JDK à l'emplacement /home/ens/forax/struct-conc/jdk-13-loom.
    Verifier que la classe java.lang.Continuation est accessible.
  2. Dans Eclipse, créer une classe Example avec un main qui créé une continuation qui affiche "hello continuation", ayant pour scope "hello-scope" puis appel la méthode run sur la continuation.
  3. Ajouter un appel à Continuation.yield() avant l'affichage de "hello continuation".
    Que se passe-t'il ?
    Appeler une seconde fois la méthode run sur la continuation dans le main, Que se passe-t'il ?
  4. A votre avis comment fonctionne une continuation lorsque l'on appel Continuation.yield() et lorsque l'on appel run().
  5. Que se passe-t'il si on appel run() deux fois et qu'il n'y a pas d'appel à Continuation.yield() à l'intérieur du code de la continuation ?
    Est-ce le comportement que l'on attend ?
  6. Rappeler la différence entre un Thread et une Continuation.