Tutorial sur les thread

Contenu du snippet

j'ai débuter à répondre à quelqu'un qui avait des problème sur c'était quoi un thread, donc après avoir écris, j'ai décider de faire un tutorial avec ma réponse pour que ça soit plus facile à trouver au autre persone qui se pose des questions

le nom français d'un thread, c'est un procédure. Donc, c'est du code qui s'exécute en même temps que le restant du code.

par exemple, mon jeux de shooting (qui en utilise, donc si tu veux un exemple, va le voir)

j'ai un tableau avec des personnages qui cours et des astériode qui se déplace. chaque personnage et chaque astéroide sont des thread différents. comme ça, en même temps qu,il déplace un personnage, il calcul un autre personnage.

si tu voudrais pas utiliser les thread, ça serait extrêment lent, puisque chaque déplacement de personnage serait un après l'autre.

la façon la plus simple de créer un thread, c'est d'implementer Runnabled (tu peut extend thread, sauf que java supporte un seul extend, donc si tu fais extend jlabel, pour déplacer un label, ben tu peux pas, puisque tu te ramasse avec 2 extends). Donc implement Runnabled. Ensuite tu fais ton constructeur. Puis tu dois faire une méthode run. le run ça sera le code qui s'exécutera en même en temps que le restant du code. Tu peut créer ta variable et quand tu voudra démarrarer le thread, tu devra lui faire un start();

tant et aussi longtemps que tu sort pas du run, tu vas bouclé (rajouter un sleep pour pas que ça aille trop vite). Moi, ce que je fais, je prend le temps en mili-seconde au début de la boucle, je fais 100% des calcul, puis je fait mon sleep - (le temps en mili-seconde + le temps en mili-seconde du début de la boucle) Comme ça, même si le code s'effectue plus lentement que prévu, il attendra tout simplement moins longtemps rendu au sleep et visuellement tu verras aucune différence

Voici une class de mon projet jeux de shooting qui utilise un thread pour déplacer un JLabel. Attention, c,est seulement une class, donc elle marche pas si elle a pas le restant du projet.

Source / Exemple :


import java.awt.event.MouseEvent;
import javax.swing.JLabel;

/************************************************************

  • <p>Title: EarthWorm Jim</p> *
  • <p>Description: TP3 pour le cour de Java Graphique</p> *
  • <p>Copyright: Copyright (c) 2003</p> *
  • @author Maxime Savard *
  • @version 1.0 *
                                                                                                                        • /
/************************************************************
  • Nom de la Classe : Déplacement *
  • Description : déplace des labels *
  • extends : JLabel *
  • implements : MémoireTemp et Runnable *
  • utilise : voir Personnage ou asteroid *
                                                                                                                        • /
public abstract class Déplacement extends JLabel implements Runnable, MémoireTemp { InterfaceJeu frame; private int yd, yf, xd, xf; //valeur méthématique X et Y private double equation; //pente private double c; //C de la pente private boolean mort = false; //s'il est mort private double Vitesse; //sa vitesse private boolean finDansEcran = false; //s'il fini dans l'écran //sa distance de déplacement private int distanceLongueur; private int distanceHauteur; private int sizeTempHeight; private int sizeTempWidth; //sa direction public boolean droite; public boolean haut; //savoir s'il est fini public boolean fin = false; public boolean gagner = false; public Déplacement() {} public void DéplacementInit() { MathEquation(); //son équiation mathématique MathVitesse(); //sa vitesse setImage(); //son image this.addMouseListener(new this_mouseAdapter(this)); this.setBounds(xd, yd, this.getIcon().getIconWidth(), this.getIcon().getIconHeight()); } public void run() { long time; int y; boolean sortirEcran = false; while (!fin) { time = System.currentTimeMillis(); //connaitre le temps présent if (fini()) { //si c'est fini victoire(); //afficher sa victoire this.setVisible(false); //terminer this.setIcon(null); fin = true; } else if (mort) { //s'il est mort Mort(); //afficher sa mort this.setVisible(false); //terminer this.setIcon(null); fin = true; } else { déplacer(time); //déplacer } } } /****************************************************************************
  • nom : this_mouseClicked
  • commentaire : image cliquer
  • recoi : la sourie
  • renvoi : rien
                                                                                                                                                        • /
void this_mouseClicked(MouseEvent e) { mort = true; } /****************************************************************************
  • nom : fini
  • commentaire : savoir si c'est fini
  • recoi : rien
  • renvoi : victoire ou non de l'objet
                                                                                                                                                        • /
private boolean fini() { boolean bDroite = false; boolean bHaut = false; gagner = frame.getFini(); if (!gagner) { //si un personnage a gagner if (droite) { //s'il va a droite if (xd >= xf) { //si a fini bDroite = true; } } //a gauche else { if (xd <= xf) { //s'il a fini bDroite = true; } } if (haut) { // en haut if (yd <= yf) { //s'il a fini bHaut = true; } } else { //en bas if (yd >= yf) { //s'il a fini bHaut = true; } } } //si horizontale et verticale est fini ou si un autre personnage a fini return bDroite && bHaut || gagner; } /****************************************************************************
  • nom : déplacer
  • commentaire : déaplcer l'objet
  • recoi : temp
  • renvoi : rien
                                                                                                                                                        • /
private void déplacer(long time) { //si la distance est plus grand horizontale if (distanceLongueur > Mémoire.JFrameLargeur / 2) { if (droite) {//s'il va a droite xd += getDéplacement(); } else { //a gauche xd -= getDéplacement(); } yd = (int) (equation * xd + c); //faire la formule math try { //attendre le temps détermier - le temps des calculs Thread.currentThread().sleep( (long) Vitesse - (System.currentTimeMillis() - time)); } catch (Exception e) {} //déplacer this.setLocation(xd, yd); }//si la distance horizontale est plus petit que la moitié de la fenêtre else { if (haut) {//s'il va vers le haut yd -= getDéplacement(); } else {//vers le bas yd += getDéplacement(); } //formule math xd = (int) ( (yd - c) / equation); try { //attendre le temps détermier - le temps des calculs Thread.currentThread().sleep( (long) Vitesse - (System.currentTimeMillis() - time)); } catch (Exception e) {} //déplacer this.setLocation(xd, yd); } } /****************************************************************************
  • nom : MathVitesse
  • commentaire : déterminer la vitesse de déplacement
  • recoi : rien
  • renvoi : rien
                                                                                                                                                        • /
private void MathVitesse() { //vitesse aléatoire double vitesseAléatoire = (Math.random() * Mémoire.PartieVariationVitesse * 2) - Mémoire.PartieVariationVitesse; //si la distance est plus grand horizontale if (distanceLongueur > Mémoire.JFrameLargeur / 2) { Vitesse *= (double) Mémoire.JFrameLargeur / (double) distanceLongueur; } else {//si la distance est petite grand horizontale Vitesse *= (double) Mémoire.JFrameHauteur / (double) distanceHauteur; } //ajouter la valeur aléatoire Vitesse += (double) (vitesseAléatoire / 100) * (double) Vitesse; //modifier la vitesse dépendant du niveau Vitesse -= frame.getNiveau() * 2; } /****************************************************************************
  • nom : MathEquation
  • commentaire : déterminer la formmule Mathématique
  • recoi : rien
  • renvoi : rien
                                                                                                                                                        • /
private void MathEquation() { int debut = (int) (Math.random() * 4); //trouver l'endroi de départ int fin; switch (debut) { //part à gauche case 0: xd = 0 - Mémoire.PartieDistanceBuffer; yd = (int) ( (Math.random() * (Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; case 1: //part en haut yd = 0 - Mémoire.PartieDistanceBuffer; xd = (int) ( (Math.random() * (Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; case 2: //part à droite xd = Mémoire.JFrameHauteur + Mémoire.PartieDistanceBuffer; yd = (int) ( (Math.random() * (Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; case 3: //part en bas yd = Mémoire.JFrameLargeur + Mémoire.PartieDistanceBuffer; xd = (int) ( (Math.random() * (Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; } fin = (int) (Math.random() * 3); //trouver l'endroi de la fin //pour pas que le départ se situe au même endroit que le départ if (fin >= debut) { ++fin; } switch (fin) { case 0: //a gauche if (finDansEcran) { xf = Mémoire.PartieDistanceFin; } else { xf = 0 - (Mémoire.PartieDistanceFin + sizeTempWidth); } yf = (int) ( (Math.random() * (Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; case 1: //en haut if (finDansEcran) { yf = Mémoire.PartieDistanceFin; } else { yf = 0 - (Mémoire.PartieDistanceFin + sizeTempHeight); } xf = (int) ( (Math.random() * (Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; case 2: //a droite if (finDansEcran) { xf = Mémoire.JFrameLargeur - (Mémoire.PartieDistanceFin + sizeTempWidth); } else { xf = Mémoire.JFrameLargeur + Mémoire.PartieDistanceFin + sizeTempWidth; } yf = (int) ( (Math.random() * (Mémoire.JFrameHauteur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; case 3: //en bas if (finDansEcran) { yf = Mémoire.JFrameHauteur - (Mémoire.PartieDistanceFin + sizeTempWidth); } else { yf = Mémoire.JFrameHauteur + Mémoire.PartieDistanceFin + sizeTempWidth; } xf = (int) ( (Math.random() * (Mémoire.JFrameLargeur - (Mémoire.PartiePasApparition * 2))) + Mémoire.PartiePasApparition); break; } //valeur temporaire double temp = yf - yd; double temp2 = xf - xd; //savoir s'il vas à droite if (temp2 <= 0) { droite = false; } else { droite = true; } //savoir s'il vas vers le haut if (temp <= 0) { haut = true; } else { haut = false; } //trouver son équation equation = temp / temp2; //trouver son C c = yd - (equation * xd); //trouver les distances distanceLongueur = Math.abs(xf - xd); distanceHauteur = Math.abs(yf - yd); } /****************************************************************************
  • nom : gagner
  • commentaire : objet a gagner
  • recoi : rien
  • renvoi : rien
                                                                                                                                                        • /
public void gagner() { gagner = true; } /****************************************************************************
  • nom : setVitesse
  • commentaire : modifier la vitesse de départ
  • recoi : vitesse
  • renvoi : rien
                                                                                                                                                        • /
public void setVitesse(double Vitesse) { this.Vitesse = Vitesse; } /****************************************************************************
  • nom : setsizeTempHeight
  • commentaire : hauteur de l'image
  • recoi : la hauteur
  • renvoi : rien
                                                                                                                                                        • /
public void setsizeTempHeight(int sizeTempHeight) { this.sizeTempHeight = sizeTempHeight; } /****************************************************************************
  • nom : setsizeTempWith
  • commentaire : largeur de l'image
  • recoi : largeur
  • renvoi : rien
                                                                                                                                                        • /
public void setsizeTempWidth(int sizeTempWidth) { this.sizeTempWidth = sizeTempWidth; } /****************************************************************************
  • nom : setfinDansEcran
  • commentaire : modifier s,il fini dans l'écran
  • recoi : finDansEcran
  • renvoi : rien
                                                                                                                                                        • /
public void setfinDansEcran(boolean finDansEcran) { this.finDansEcran = finDansEcran; } //class abstrac, voir asteroid ou personnage public abstract void setImage(); public abstract void victoire(); public abstract void Mort(); public abstract int getDéplacement(); } class this_mouseAdapter extends java.awt.event.MouseAdapter { Déplacement adaptee; this_mouseAdapter(Déplacement adaptee) { this.adaptee = adaptee; } public void mouseReleased(MouseEvent e) { adaptee.this_mouseClicked(e); } }

Conclusion :



pour plus de renseignement, télécharger mon projet jeux de shooting
faut posséder winrar opur pouvoir le décompresser, puisqu'avec le son, c'était trop gros pour le site, j'ai du splitter en 3 morceaux

Partie 1
http://www.javafr.com/article.aspx?Val=277
Partie 2
http://www.javafr.com/article.aspx?Val=276
Partie 3
http://www.javafr.com/article.aspx?Val=275

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.