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!