Délai d'exécution de thread
Bonjour,
j'ai un problème à propos de mémoire partagée+thread, voilà le contexte:
depuis un client A j'envoie un message;
le client B reçoit le message
le client B envoie un ACK correspondant au message reçu;
le client A reçoit l'ACK correspondant au message qu'il vient d'envoyer et envoie un nouveau message.
Mon problème se situe lors de la réception de l'ACK par le client A (l'émetteur du message d'origine). En effet, je ne dois envoyer le prochain paquet qu'à 2 conditions:
_ l'ACK que je viens de recevoir correspond bien au message que je viens d'envoyer;
ET
_ j'ai reçu l'ACK du message avant 100ms (dépassé ce délai, le message d'origine est tout simplement renvoyé).
La première condition est triviale, mais la seconde l'est beaucoup moins.
J'ai testé 2 pistes qui me semblent les plus adéquates:
_ utiliser la classe Timer avec son schedule(TimerTask, long)
_ utiliser les threads (mais là j'avoue avoir quelques difficultés alors que je crois que ma solution en est étroitement liée)
Voici mon code pour l'instant (utilisant la notion de thread):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| package communication.system;
//Add-ons packages
import communication.main.Message;
//Exceptions packages
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* This class will wait all acknowledgements of each packet sent
*
* @version 8.0, 24/11/07
* @since version 1.0
*
*/
public class WaitForAcknowledgement extends Thread {
/**
* This method will wait while an ACK isn't received
* @return true if ID acknowledgement received is the same that ID packet sent
*/
private static Integer integer = -1;
private static Message messageMessage;
/**
* Constructor
* @param message
*/
WaitForAcknowledgement (Message message) {
messageMessage = message;
}// WaitForAcknowledgement (Message)
/**
* Method who will wait each ACK
* @param id the last packet Id
* @param message This object Message is used only to get network parameter
* @return a boolean: TRUE if Id ack packet and Id data packet is same, otherwise FALSE
* @throws FileNotFoundException
* @throws IOException
* @throws InterruptedException
*/
public static boolean waitForAck(int id, Message message)
throws FileNotFoundException, IOException, InterruptedException {
//create my thread calling WaitForAcknowledgement class constructor
Thread T = new WaitForAcknowledgement(message);
//Waits at most 100 milliseconds for this thread to die. A timeout of 0 means to wait forever.
T.join(100);
//start my thread
T.start();
while(T.isAlive());
//if I received my ACK, return TRUE else FALSE
if(id==integer.intValue()) return true;
else return false;
} //waitForACK()
/**
* This method is used by the thread
*/
public void run() {
try {
integer = (Integer)PacketsReceptor.packetReceived(messageMessage);
interrupt();
}
catch(FileNotFoundException fnfe) {System.out.println(fnfe);}
catch(IOException ioe) {System.out.println(ioe);}
catch(InterruptedException ie) {System.out.println(ie);}
}// run()
}// Class WaitForAcknowledgement |
P.S. ne faites attention à mon anglais qui est des plus limité :oops: