noodles83
31-12-2009, 18:34
Devo implementare un client che invia dei messaggi TCP ad un server secondo un loro protocollo.
Secondo le specifiche non il client non deve inviare più di 1 msg ogni 100millisec e deve inviare almeno un messaggio ogni 1000 millisec.
Ho pensato di utilizzare la classe java.util.Timer.
Nel mio caso ho una coda di msg da inviare e la mia idea è quella di avere un thread che si occupa di inviare questi msg non appena sono disponibili secondo le specifiche che vi ho detto prima.
public class Temporizzatore {
ArrayList<Message> codaMsg = new ArrayList<Message>(); // coda di messaggi da inviare
Timer timer;
int count = 0; //contatore iterazioni senza msg da inviare
//costruttore
public Temporizzatore(){
this.timer=new Timer();
timer.schedule(new sendingTask(),0,100); //parte subito e itera ogni 100msec
}
class sendingTask extends TimerTask{
public void run(){ }
}
}
la inner class sendingTask contiene ovviamente il metodo run(), che non vi ho scritto. Questo metodo si limita a verificare che la coda non sia vuota, se non è vuota spedisce il primo msg e termina. Se la coda è vuota incrementa count di uno e finisce. Se count è uguale a 9 vuol dire che sono arrivato a 900msec e che quindi devo per forza inviare un msg, che sarà un msg della coda se lo contiene oppure un semplice messaggio PING, questo per garantire che ne invii almeno ogni secondo. Tutto questo è garantito funzionare ogni 100msec dalla timer.
La cosa funziona, ma c'è una cosa che non ho chiaro e mi turba. Quanti thread utilizzo cosi?
Facendo come faccio io ogni 100msec creo un thread che esegue la run e poi termina?
Se questo è il caso, mi pare sia uno spreco enorme in termini di overhead, dato le poche cose che deve fare il thread, specialmente nel caso in cui si limita solo ad incrementare count.
che mi dite?
Secondo le specifiche non il client non deve inviare più di 1 msg ogni 100millisec e deve inviare almeno un messaggio ogni 1000 millisec.
Ho pensato di utilizzare la classe java.util.Timer.
Nel mio caso ho una coda di msg da inviare e la mia idea è quella di avere un thread che si occupa di inviare questi msg non appena sono disponibili secondo le specifiche che vi ho detto prima.
public class Temporizzatore {
ArrayList<Message> codaMsg = new ArrayList<Message>(); // coda di messaggi da inviare
Timer timer;
int count = 0; //contatore iterazioni senza msg da inviare
//costruttore
public Temporizzatore(){
this.timer=new Timer();
timer.schedule(new sendingTask(),0,100); //parte subito e itera ogni 100msec
}
class sendingTask extends TimerTask{
public void run(){ }
}
}
la inner class sendingTask contiene ovviamente il metodo run(), che non vi ho scritto. Questo metodo si limita a verificare che la coda non sia vuota, se non è vuota spedisce il primo msg e termina. Se la coda è vuota incrementa count di uno e finisce. Se count è uguale a 9 vuol dire che sono arrivato a 900msec e che quindi devo per forza inviare un msg, che sarà un msg della coda se lo contiene oppure un semplice messaggio PING, questo per garantire che ne invii almeno ogni secondo. Tutto questo è garantito funzionare ogni 100msec dalla timer.
La cosa funziona, ma c'è una cosa che non ho chiaro e mi turba. Quanti thread utilizzo cosi?
Facendo come faccio io ogni 100msec creo un thread che esegue la run e poi termina?
Se questo è il caso, mi pare sia uno spreco enorme in termini di overhead, dato le poche cose che deve fare il thread, specialmente nel caso in cui si limita solo ad incrementare count.
che mi dite?