cs_Bog
Messages postés29Date d'inscriptionmercredi 26 décembre 2001StatutMembreDernière intervention28 janvier 2003
-
26 août 2002 à 12:12
dweeves
Messages postés5Date d'inscriptionmardi 27 août 2002StatutMembreDernière intervention30 août 2002
-
28 août 2002 à 12:32
Bonjour.
Je travaille sur une applet du style animation.
J'ai donc recours aux threads.
Je me suis documenté et j'ai fait un essai qui n'a pas été concluant.
En fait il faudrait que j'execute 2 Threads et non pas un seul comme je le pensais.
Le problème c'est que je ne sais pas comment faire.
Etant donné que mes 2 threads auront un traitement distinct, il faudrait que je definisse deux fonctions run() , mais je ne sais pas si c'est possible...
J'attend des explications CLAIRES sur le sujet, car j'ai bcp trop de questions qui me trottent pour me lancer!
P.S: Et puis que choisir, entre la méthode implements runnable, ou extends Thread ?
dweeves
Messages postés5Date d'inscriptionmardi 27 août 2002StatutMembreDernière intervention30 août 2002 27 août 2002 à 12:21
Les threads Java sont assez simples a utiliser.
Dans ton cas, il faudra en effet utiliser 2 classes implementant l'interface Runnable().
class A implements Runnable
{
void run()
{
/** le code a executer **/
}
}
class B implements Runnable
{
void run()
{
/** le code a executer **/
}
}
Je prefere utiliser des classes qui implementent l'interface runnable(), cela fait mieux ressortir la différence entre le traitement effectué (le contenu du run()) et la manière dont il est effectué (le thread n'est qu'un moyen d'executer la fonctionnalité voulue en parallele d'autre traitements)
Il y a peu de cas qui justifie de specialiser la classe Thread.
Elles permettent d'isoler les fonctionnalites.
Pour lancer les threads , il suffit d'operer ainsi
class X
{
void lancethreads()
{
A inst_a=new A();
B inst_b=new B();
Thread ta=new Thread(inst_a);
Thread tb=new Thread(inst_b);
/** initialiser les instances (si besoin) **/
A.xxx
B.xxx
ta.start(); /** demmare le thread pour l'instance A **/
tb.start() /** demmare le thread pour l'instance B **/
}
}
Mais tout n'est pas si simple. Dans le cas d'une applet il est preferable de la rendre Runnable aussi. Pour economiser du CPU lors de son affichage.
Ensuite, la communication inter-thread necessite l'utilisation de variables partagées protégées en accès via des blocs synchronized.
Dans les applications de type graphique , et plus particulierement en Swing, il faut bien maitriser qui a la main au moment de l'affichage. En regle generale, mieux vaux qu'un seul thread soit responsable de l'affichage (Swing d'ailleurs possède des methodes "speciales" pour favoriser ce cas : InvokeLater et consorts).
Dans des cas simples, on peut faire dessiner plusieurs threads ( a partir du moment ou l'on synchronise bien).
Enfin bref, les ressources ne manquent pas.La programmation multithread est tres importante en Java. Elle constitue une des bases fondamentales des architectures applicatives evoluées.
Voila, j'espere que j'ai repondu a tes interrogations
-------------------------------------------------
la programmation est un art: la maitrise technique n'est qu'une etape nécessaire a l'expression du talent
cs_Bog
Messages postés29Date d'inscriptionmercredi 26 décembre 2001StatutMembreDernière intervention28 janvier 2003 27 août 2002 à 17:41
En fait je vois tjrs pas comment il faut que j'arrête mes threads part stop() :
ce que je voudrais faire c'est faire traiter plusieurs taches par mon premier thread, puis une fois ces taches terminées stopper ce thread et lancer l'autre qui traiterait de plusieurs taches egalement.
Quel est le schéma ?
start thread A
...
stop thread A
...
start thread B
...
stop thread B
dweeves
Messages postés5Date d'inscriptionmardi 27 août 2002StatutMembreDernière intervention30 août 2002 27 août 2002 à 18:28
Si tu veux executer les taches sequentiellement , tout en utilisant des threads,il va falloir un peu ruser.
C pas tres dur.
IL faut que tu declares une classe qui va gerer l'execution des autres. Appelons la 'Scheduler'. Nous pouvons la doter d'une methode AddTask qui va la rendre capable d'ajouter un nouveau "travail" a effectuer et d'une liste de travaux .
Ainsi , on aura un truc du style
public class Sheduler implements Runnable
{
java.util.Vector tasklist;
for(i=0;i<tasklist.size();i++)
{
current=(Runnable)tasklist.get(i);
Thread taskthread=new Thread(current);
taskthread.start(); /** On demarre le thread **/
taskthread.join(); /** on attend qu'il ait fini **/
}
}
}
Ainsi, dans ton code principal , tu auras un truc du style
On ne peut pas "stopper " un thread (enfin, si mais c pas recommande). On peut par contre attendre qu'il ait fini son boulot (avec join())
L'idee derriere la classe scheduler est de generaliser le principe que tu as enonce.
Bien sur, le code est un squelette, il te faudra completer la classe afin d'ajouter les fonctionnalités pour vider la liste des taches , voire ameliorer le conteneur (un Vector c pas tres "smart" ). Je n'ai pas voulu trop t'embrouiller mais avec les Collections (Vector , List etc...) , il est beaucoup + approprie d'utiliser les iterateurs , mais g voulu faire simple et comprehensible.
J'espere que ca a pu t'aider
-------------------------------------------------------------
la programmation est un art: la maitrise technique n'est qu'une etape nécessaire a l'expression du talent
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Bog
Messages postés29Date d'inscriptionmercredi 26 décembre 2001StatutMembreDernière intervention28 janvier 2003 27 août 2002 à 18:45
Euh, j'ai l'impression de m'eloigner de + en + du bord la ...
Je vais tenter ta premiere explication, mais ce qui me derange c'est que j'obtiens " cannot resolve symbol method start() " !
j'ai bien fait :
ThreadA aThread = new ThreadA();
ThreadB bThread = new ThreadB();
avant de lancer start avec aThread et bThread .
Que demande t il de plus ? De definir la methode start() de la class Thread, c ca ?
En effet qd j'avais codé en faisant extends Thread, je n'avais donc pas ces messages.
Comment puis je faire ? J'ai un trou...
dweeves
Messages postés5Date d'inscriptionmardi 27 août 2002StatutMembreDernière intervention30 août 2002 28 août 2002 à 12:32
Tu as confondu les objets de traitement : les classes A et B , qui sont des Runnable (et donc pas des Threads) avec les objets ta et tb qui sont des Threads (de base).
Il est important de faire la distinction. Il ne me parait pas une bonne idee de nommer tes objets de traitement Threadxxx , ca prete a confusion.
Regardes bien le premier exemple, ta et tb sont declares en tant "Thread" et sont initialises avec A et B en parametre.
Ce sont ta et tb qui possedent start() pas A et B.
L'idee est de dire "fait le traitement de A en Thread "et fait "le traitement de B en Thread".
la nature d'un traitement est souvent independante de la maniere de l'executer.
Sinon, sur mon deuxieme exemple , g fait une erreur de frappe. c pas "sched.start()" mais "schedthread.start()" qu'il faut lire.
Le deuxieme exemple est plus sioux mais plus joli aussi (bien que pas tres complique).
Pour l'arret de threads , de toute maniere , tu n'a pas le choix.:il faut utiliser join().
En effet, seul join() te garantit la mort du thread (d'ailleurs le role de join() est d'attendre cette mort).
Si tu veux le stopper volontairement , il faudra utiliser une variable partagée et tester la fin du traitement dessus (cf doc Java).
-------------------------------------------
la programmation est un art: la maitrise technique n'est qu'une etape nécessaire a l'expression du talent