Newsgroup: it.comp.java
Titolo: Metodo sleep di Thread

Salve a tutti. Sto scrivendo un thread nel quale avrei bisogno di
bloccare il processo per alcuni ms, e la cosa dovrebbe essere
abbastanza precisa. Invece ho notato che sleep sballa parecchio, da
15ms mi passa a 40ms, e l'ho controllato facendo un controllo del tempo
intercorso. Esiste mica un modo preciso per fermare un processo per un
numero fissato di ms?
Grazie mille.

Luca wrote:

La documentazione di Thread ti da la motivazione:
Causes the currently executing thread to sleep (temporarily cease execution)
for the specified number of milliseconds, subject to the precision and
accuracy of system timers and schedulers.
purtroppo non hai la certezza, la cosa migliore da fare per ridurre l'errore
è di fare un ciclo (non ricordo tutte i nomi esattamente, prendilo come
pseudo-codice):
long start = System.currentMillis();
while(System.currentMillis() < (start + 15)){
   Thread.currentThread.sleep(1);
}
Luca

> processo per un numero fissato di ms?
LF> La documentazione di Thread ti da la motivazione:
LF> Causes the currently executing thread to sleep (temporarily cease
LF> execution) for the specified number of milliseconds, subject to
LF> the precision and accuracy of system timers and schedulers.
LF> purtroppo non hai la certezza, la cosa migliore da fare per
LF> ridurre l'errore è di fare un ciclo (non ricordo tutte i nomi
LF> esattamente, prendilo come pseudo-codice):
LF> long start = System.currentMillis(); while(System.currentMillis()
LF> < (start + 15)){ Thread.currentThread.sleep(1);
LF> }
Mangi CPU per nulla. E lo stesso non sei immune dallo jitter dovuto al
passaggio per  la coda  di scheduling (se  oltretutto ci sono  i green
thread.... Brrrr :) )
L'UNICO metodo per avere una temporizzazione ragionevolmente precisa è
affidarsi a dell'hardware e  gestire _rapidamente_ le segnalazioni che
questo invia (interrupt).
Oppure c'è qualcosa in pacchetti per il multimedia...
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software
A Cesare avrei detto di scrivermi a	 | To Caesar I woul have said "emai me to
fn...@rat.vg
  (Lui cifrava in rot13) | 
fn...@rat.vg
  (He encrypted wit Rot13)

 questo invia (interrupt).
Non mi sembra una soluzione Java-oriented....

> segnalazioni che questo invia (interrupt).
LF> Non mi sembra una soluzione Java-oriented....
Java non è l'unico linguaggio di programmazione esistente sul pianeta,
anche se è elegante.


 
Ah...perché qui si stava parlando di java.lang.Thread.sleep(long)....

> 
LF> Ah...perché qui si stava parlando di java.lang.Thread.sleep(long)....
E del fatto che non funzionava come atteso...
E non funzionava perché era usato per uno scopo per cui non era adatto.
Non tutti i problemi sono chiodi (cfr. antico proverbio giapponese)


 }
E se usassi la classe Timer di java.util? Avrei maggiore precisione
secondo te? O il problema rimane lo stesso?
Grazie mille.

 secondo te? O il problema rimane lo stesso?
Non credo diventi più preciso, perché Timer è una classe di utilità per la
schedulazione, però vale la pena provare. 
Luca

>>>> "L" == Luca  <lu...@fatti.miei> writes:
L> E se usassi la classe Timer di java.util? Avrei maggiore precisione
L> secondo te? O il problema rimane lo stesso?  Grazie mille.
Se č quella che usano per il multimedia, puň essere utile.


Purtoppo il problema è che nel momento in cui metti un thread in
attesa, qualcun'altro occupa le risorse.
Dopo 15ms il tuo thread passa dallo stato di sleeper(addormentato) a
quello di ready(pronto).
Il fatto che sia ready non vuol dire che venga eseguito.
Il tuo thread verrà eseguito non appena il processore è libero e lui
ha i requisiti per occupare la cpu.