MàJ deux ou trois semaines de cours

This commit is contained in:
olivier
2008-12-05 08:25:20 +01:00
parent fa26da8678
commit a5abfaf0bc
26 changed files with 246 additions and 184 deletions

View File

@ -1,5 +1,5 @@
Jeudi, 20 nov 2008
Séance 1
TP1
====== Comparaison ======

View File

@ -1,7 +1,8 @@
21 novembre 2008
Séance 2
Séance 1
Les threads
https://tetras.u-strasbg.fr/prive/pedagogie/LP/P51/index.php?menu=101
====== Cours ======

View File

@ -1,127 +0,0 @@
21 novembre 2008
Séance 2
Les threads
====== Cours ======
Le but de ce cours est d'utiliser la puissance des nouveaux processeurs pour faire des applications rapides.
threads = sous partie d'un processus, donc se lance plus vite qu'un processus et prend moins d'espace mémoire
Faire un thread implique une nouvelle pile d'exécution et de nouveaux registres alloués.
===== Les Threads, dans Java =====
Dans la classe Java.lang.Thread, il faut l'interface *Runnable :*, et la méthode *run()* (qui ne prend pas d'arguments).
Faire un thread en Java :
* soit on étend (sous - classer) un thread (à l'aide d'extends)
* soit on implémente *Runnable* à notre classe Java.
===== Comment choisir quelle méthode utiliser ? =====
Comme Java n'accepte pas l'héritage multiple, mieux vaut implémenter qu'étendre si on a déjà étendu notre classe Java avec une autre.
Implémenter "marche à tout les coups", contrairement à l'autre méthode.
===== Gestion des priorités =====
Si un thread n'est pas actif, il ne consommera pas de temps CPU, vu qu'il est mis de côté.
MAX_PRIORITY et MIN_PRIORITY sont des variables définies dans la classe Thread.
===== Concurrence d'accès =====
Pour éviter l'interblocage, on utilise le mot clé *synchronized* pour gérer les concurrences d'accès.
==== Concurrence d'accès sur une méthode ====
Le <u>verrou est sur l'instance de la classe</u> et pas sur la classe elle même
Mettre un verrou pour une instance d'un champ statique (static) n'est pas la bonne solution !!!
==== Contrôler l'accès à un objet ====
Utile si la classe a été créée sans être prévue/pensée pour les Threads.
Ceci permet d'utiliser une classe dans des Threads.
===== Groupes de Threads =====
Seulement si on a beaucoup de threads (en faisant des *ThreadGroup*).
Permet de lancer un ensemble de threads sans avoir à les instancier l'un après l'autre.
====== Exercice ======
===== Démonstration du cas de l'executor =====
3 producteurs ont une liste de produits. Ils gèrent une file d'attente.
Les consommateurs 1 et 2 tentent d'accéder à la file d'attente.
Il faut gérer les processus inactifs et la synchronisation.
* * *
<code java>
Executor ex = | Executors.new SingleThread();
| Executors.new ThreadPool(2);
for (int i=0 ; i < 1 000 ; i++)
ex.execute(new Runnable() {
public void run() {
System.out.println("o")
}
});
</code>
Dans les exécuteurs il n'y a pas de gestion de dépendances, donc on ne sait pas si le 5ième envoyé sera exécuté après le 4ième : ça faut le faire à la main.
===== Cas d'interblocage =====
Tout objet
<code java>
class DeadLock {
private final Object lock1 = new Object();
private final Object lock2 = new Object();
void a() throws Interrupted Exception {
lock1.wait();
lock2.notify();
}
void b() throws Interrupted Exception {
lock2.wait();
lock1.notify();
}
}
</code>
Un thread appelle la méthode a() :
* Le lock1 passe en attente.
Un second thread appelle la méthode b() :
* Il se met en attente d'un notify (comme le lock1)
Donc cela fait un verrou mortel, car on en sort pas. Pourquoi :
* lock1 attend lock1.notify (qui est dans lock2)
* lock2 attend lock2.notify (qui est dans lock1, lui même en attente d'un notify)
Nous sommes donc dans un DeadLock.
===== Explications =====
wait() : suspend un thread courant
notify(): réactive UN thread qui a fait un *wait()* sur l'instance
notifyAll(): réactiver TOUS les threads qui ont fait un *wait()* sur l'instance
Quand un producteur aura fini de produire, il va activer UN thread pour le consommateur : pour pas mettre sur la paille le second consommateur.

View File

@ -0,0 +1,87 @@
28 novembre 2008
Séance 2
Cf. https://tetras.u-strasbg.fr/prive/pedagogie/LP/P51/index.php?menu=203
====== Cours ======
===== Interface principales =====
* PreparedStatement et CallableStatement proviennent de Statement
* CallableStatement : procédures stockées
* 'DatabaseMetaData', peut être récupéré à partir d'un objet 'Connection' => informations sur la base de données
* DataSource : plutôt que faire des connexions à la base de données on va se connecter à la source de données qui peut être une base virtuelle (un genre)
===== Classes principales =====
Date n'est pas la même classe dans java.sql et java.util => 2 façons différentes d'appréhender la chose.
===== Pilotes =====
Type III : utile pour de l'embarqué par exemple, car assez léger
Type IV : les meilleurs, mais pas toujours disponibles (payants)
===== Connexion à une BDD =====
jdbc:oracle:thin:@grive.u-strasbg.fr:1521:BASE
* jdbc : pilote
* oracle : type de base de données
* thin : pilote léger d'oracle (cas particulier)
* @grive.u-strasbg.fr : adresse du serveur
* 1521 : port d'accès
* BASE : nom de la base de données
==== La classe Connection ====
prepareStatement : requête paramétrée cachée sur le serveur
prepareCal : procédure stockée
isClosed est généralement à vrai quand c'est NOUS qui avons utilisé la méthode close() pour fermer la connexion à la base de données.
==== Requête de consultation ====
Il ne faut pas considérer que le ResultSet peut tout contenir et donc que nous pouvons faire next() ET previous(). Cela dépend de l'implémentation du pilote JDBC utilisé pour la base de données utilisée.
==== Correspondance entre types Java et SQL ====
getFloat sur un NULL : donne 0
Pour faire que de l'affichage, on peut faire getString()
==== Modification de la base ====
execute UPDATE renvoie un entier qui défini le nombre de lignes modifiées dans la base de données.
==== Instructions SQL paramétrées ====
Les points d'interrogation définissent les paramètres qui seront donnés plus tard.
Il est possible d'utiliser des variables nommées à la place des points d'interrogations : à vérifier.
==== Procédure SQL stockées ====
Peut éviter de faire des transferts de données entre la BDD et le client (lourd ou web). Donc autant tout faire sur le serveur si pas besoin de plus.
Permet aussi d'être indépendant des BDD.
==== Résumé des méthodes de l'interface 'Statement' ====
addBatch : Optimisation de la relation avec le serveur
==== Les méta - données ====
Grâce aux métadatas d'un ResultSet sur une base de donnée on peut savoir quelle version de JDBC est adaptée
==== RowSet ====
= Abstraction autour d'un ResultSet.
====== Exemple ======
HSQLDB : permet de faire une BDD entièrement en Java, ce qui permet de bosser sur nos cours sans soucis de BDD.