Affichage des articles dont le libellé est thread. Afficher tous les articles
Affichage des articles dont le libellé est thread. Afficher tous les articles

vendredi 20 février 2009

Utilisations des threads

Il existe deux techniques d'utilisation des thread en JAVA :

* Implémenter l'interface Runnable
* Etendre la classe thread.

Dans l'optique de faire un code robuste, je recommande d'implémenter l'interface Runnable, elle évite de se perdre dans la profusion de méthodes offertes par la classe Thread.

Les threads servent à paralléliser les tâches. Deux opérations clés sont importantes.

* Le départ
* La synchronisation (jointure)

Le plus délicat est de comprendre l'utilisation du wait et du notify. Pour être utilisé le wait et le notify doivent être placé sur la même classe (Ici le ThreadGroup)


Ce bloc lance 25 threads

// Ici nous construisons sans les déclencher tous les thread dont nous avons besoins
List<thread> threads = new ArrayList<thread>();
ThreadGroup threadGroup = new ThreadGroup("MyThreadList");
for (int i = 0; i < thread =" new" thread =" new"> 0) {
System.out.println("Threads restants : " + threadGroup.activeCount());
// Attente d'une nçotification
threadGroup.wait();
}
}



Voici l'implémentation de Runnable


public class MyThread implements Runnable {

public MyThread(ThreadGroup tg) {
threadGroup = tg;
}

public void run() {
System.out.prinln("Effectue le traitement");

// Ici le ThreadGroup est notifié
synchronized (threadGroup) {
// Notification du parent
threadGroup.notify();
}
}

mardi 11 décembre 2007

Hibernate session en multithread

J'utilise plusieurs threads pour la requête affichage de liste dans une application WEB. Lorsque je lance une requête en servant de la session Hibernate (partagée par les différents threads) j'obtiens le message suivant :
Exception in thread "Thread-41" org.hibernate.HibernateException: Not able to obtain connection
at
org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:113)

Le forum http://forums.hibernate.org/viewtopic.php?t=945337 suggère de passer dans un mode transactionnel, mais cela ne fonctionne pas dans mon cas. Il suggère également de laisser spring la possibilité de créer des connexions sur les threads qui en ont le besoin à l'aide de l'option allowCreate

à true ou bien de faire des requête callback.

Réponse :

La session hibernate gèe une seule connection et n'est pas thread safe : on ne peut pas partager une instance de session par plusieurs threads à moins d'utiliser les mécanismes de synchronisation.

C'est la même chose pour une connection JDBC : on ne peut pas avoir un thread qui lit les résultats d'une requête tandis qu'un autre tente de lancer un autre select sur la
même connection.


Tu peux faire rendre ton code thread safe si ton cas d'utilisation le permet en utilisant le mot clef synchronized.

// un seul thread à la fois peut exécuter ce code
synchronized {

// mon code

}

ou

synchronized(maSession) {
// mon code

}