mardi 15 février 2011

Un pool de threads - Executors-


Raison pour utilisée un pool de threads:
*Si votre programme crée un grand nombre de threads courts, il devra plutôt utiliser un pool de threads.
*La création d’un grand nombre de threads peut considérablement dégrader les performances, voire bloquer la machine virtuelle. Dans ce cas de figure utilisez un pool de threads "fixe" qui limite le nombre total de threads simultanés.
la méthode utilisé est :

newFixedThreadPool :Le pool contient un jeu fixe de threads. Elle construit un pool de threads de taille fixe.
Si le nombre de tâches envoyées est supérieur au nombre de threads inactifs, les tâches non servies sont placées dans une queue. Elles sont exécutées à la fin des autres tâches.
Cette méthodes renvoie un objet de la classe ThreadPoolExecutor qui implémente l’interface ExecutorService.
Vous pouvez ensuite envoyer  un Runnable ou un Callable à un ExecutorService de l’une des manières suivantes :
Future submit(Runnable task)
Future submit(Runnable task, T result)
Future submit(Callable task)

Lorsque vous avez terminé avec un pool de connexion, appelez shutdown. Cette méthode lance la
séquence de fermeture du pool.

Voici, en bref, ce qu’il faut faire pour utiliser un pool de connexion :
1. Appelez la méthode statique  newFixedThreadPool de la classe Executors.
2. Appelez submit pour envoyer des objets Runnable ou Callable.
3. Pour pouvoir annuler une tâche ou si vous envoyez des objets Callable, restez sur les objets Future renvoyés.
4. Appelez shutdown lorsque vous ne voulez plus envoyer de tâches.

Exemple d'application : (Voir la vidéo demo , directement sur le blog)



ExecutorService: gère la gestion des Threads d'une manière optimale en arrière plan.


Exemple :

ExecutorService service = Executors.newFixedThreadPool(10)

Callable et Future


L’interface Callable est un type à paramètres, avec une seule méthode call :
public interface Callable<V>
{
V call() throws Exception;
}

L’interface Future possède les méthodes suivantes :
public interface Future<V>
{
V get() throws...;
V get(long timeout, TimeUnit unit) throws...;
void cancel(Boolean mayInterrupt);
boolean isCancelled();
boolean isDone();
}

Future : Notion utilisé lorsqu'il y a une asynchronicité entre la requête et la réponse. C'est l'interface Future du package java.util.concurrent

L’emballage FutureTask est un mécanisme commode pour transformer un Callable à la fois en Future et en Runnable : il implémente les deux interfaces:
Par exemple :(voir cette vidéo)