Synchroniser et communiquer 2 threads

sara2686 Messages postés 1 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 4 mars 2011 - 4 mars 2011 à 18:22
cs_neone Messages postés 96 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 7 mars 2011 - 7 mars 2011 à 16:05
Salut;
jé 2 threads chacun d'eux exécute un code différent.
je voudrais:
1. lancer les deux en meme temps sachant ke jé un pc avec 2 processeurs
2. à un certain nbr d'itération les deux threads échangent un certain nbr d'information

j'attentdrai votre aide é merci

3 réponses

cs_neone Messages postés 96 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 7 mars 2011
7 mars 2011 à 15:53
Bonjour,
tes threads sont-ils lies ? ou pas? partagent-ils des ressources?. en gros je pense qu'il te faut les synchroniser soit par methode ou objet. apres je ne sais pas si c'est vraiment ton cas. boncourage
0
cs_jojolemariole Messages postés 519 Date d'inscription mercredi 21 mars 2007 Statut Membre Dernière intervention 19 décembre 2016 25
7 mars 2011 à 15:58
Salut,

Cet article est peut-être intéressant (je parcouru très rapidement et il a l'air bien) :
http://rom.developpez.com/java-synchronisation/#LIII-D

À mon avis, une méthode sympa pour commencer est la synchronisation par sémaphore.
Voici une classe qui l'implémente de façon très basique :

import java.util.concurrent.Semaphore;

/**
 * 
 * @author guehenneux
 * 
 */
public class ThreadCommuniquant extends Thread {

protected String messageRecu;
protected Semaphore semaphore;

/**
 * 
 */
public ThreadCommuniquant() {
semaphore = new Semaphore(0);
}

/**
 * 
 * @param message
 */
public void envoyerMessage(String message) {

messageRecu = message;
semaphore.release();

}

/**
 * 
 * @param millisecondes
 */
protected void pause(long millisecondes) {

try {
sleep(millisecondes);
} catch (InterruptedException interruption) {
interruption.printStackTrace();
}

}

/**
 * 
 */
protected void attendreMessage() {

try {
semaphore.acquire();
} catch (InterruptedException interruption) {
interruption.printStackTrace();
}

}

}


À partir de ça on peut imaginer un petit scenario de communication entre un Thread A et un Thread B :

/**
 * 
 * @author guehenneux
 * 
 */
public class ThreadA extends ThreadCommuniquant {

private ThreadB threadB;

@Override
public void run() {

/*
 * On fait quelques iterations.
 */

for (int i = 0; i < 10; i++) {

System.out.println("Thread A : " + i);
pause(1000);

}

/*
 * On envoit une question au thread B.
 */

threadB.envoyerMessage("Comment ça va?");
System.out.println("Thread A : question envoyée");
pause(1000);

/*
 * On attend la reponse du thread A.
 */

attendreMessage();

/*
 * On affiche la reponse recue.
 */

System.out.println("Thread A : réponse reçue "" + messageRecu + '"');

/*
 * On fait quelques iterations.
 */

for (int i = 10; i < 20; i++) {

System.out.println("Thread A : " + i);
pause(1000);

}

}

/**
 * @param threadB
 *            the threadB to set
 */
public void setThreadB(ThreadB threadB) {
this.threadB = threadB;
}

}


/**
 * 
 * @author guehenneux
 * 
 */
public class ThreadB extends ThreadCommuniquant {

private ThreadA threadA;

@Override
public void run() {

/*
 * On fait quelques iterations.
 */

for (int i = 0; i < 10; i++) {

System.out.println("Thread B : " + i);
pause(500);

}

System.out.println("Thread B : en attente de la question...");

/*
 * On attend la question du thread A.
 */

attendreMessage();

/*
 * On affiche la question recue.
 */

System.out.println("Thread B : question reçue "" + messageRecu + '"');

/*
 * On fait quelques iterations.
 */

for (int i = 10; i < 20; i++) {

System.out.println("Thread B : " + i);
pause(500);

}

/*
 * On envoit la reponse.
 */

threadA.envoyerMessage("Bien et toi?");

}

/**
 * @param threadA
 *            the threadA to set
 */
public final void setThreadA(ThreadA threadA) {
this.threadA = threadA;
}

}


Et voici le code pour tester ce petit scenario :

/**
 * 
 * @author guehenneux
 * 
 */
public class TestThread {

/**
 * 
 * @param arguments
 *            inutiles
 */
public static void main(String... arguments) {

ThreadA threadA = new ThreadA();
ThreadB threadB = new ThreadB();

threadA.setThreadB(threadB);
threadB.setThreadA(threadA);

threadA.start();
threadB.start();

}

}


PS : fais un effort pour l'orthographe parce que là, ça pique les yeux!
0
cs_neone Messages postés 96 Date d'inscription mercredi 23 novembre 2005 Statut Membre Dernière intervention 7 mars 2011
7 mars 2011 à 16:05
Bonjour, si la solution vous convient alors veuillez le signaler . bonne journée.
0
Rejoignez-nous