Ces deux déclarations sont-elles équivalentes?
Thread.sleep(0);
Thread.yield();
Ces deux déclarations sont-elles équivalentes?
Thread.sleep(0);
Thread.yield();
Non. La différence la plus évidente est que sleep()
jette les (vérifiés) InterruptedException
. En pratique, l'effet peut être presque identique, mais il dépend entièrement de la mise en œuvre.
Je parierais que faire chaque million de fois de suite prendrait beaucoup plus de temps pour dormir (), car la granularité de la minuterie du système le fait probablement dormir pendant un laps de temps non négligeable.
Cela dépend vraiment de la plate-forme et la version de la JVM. Par exemple, sous Windows dans le JDK 5 (Hotspot), le rendement() est littéralement mise en œuvre du Sommeil(0)-- bien qu'un sommeil de 0 est traitée légèrement spécialement par Windows que je me souviens. Mais dans le JDK 6, yield() est implémenté comme SwitchToThread().
J'ai rassemblé quelques informations il y a un moment sur le Fil.rendement(), y compris certains implementational les détails qui peuvent être d'intérêt. (Vous pouvez aussi voir les choses sur le Fil.sleep() j'ai mis en place sur le même site.)
OpenJDK source (Java SE 7) ont mise en œuvre pour l' Thread.sleep(0)
en JVM_Sleep
fonction de jvm.cpp:
if (millis == 0) {
// When ConvertSleepToYield is on, this matches the classic VM implementation of
// JVM_Sleep. Critical for similar threading behaviour (Win32)
// It appears that in certain GUI contexts, it may be beneficial to do a short sleep
// for SOLARIS
if (ConvertSleepToYield) {
os::yield();
} else {
ThreadState old_state = thread->osthread()->get_state();
thread->osthread()->set_state(SLEEPING);
os::sleep(thread, MinSleepInterval, false);
thread->osthread()->set_state(old_state);
}
}
Et implémentation de Fil.rendement() ont le code suivant:
// When ConvertYieldToSleep is off (default), this matches the classic VM use of yield.
// Critical for similar threading behaviour
if (ConvertYieldToSleep) {
os::sleep(thread, MinSleepInterval, false);
} else {
os::yield();
}
Donc, Thread.sleep(0)
et Thread.yield()
peut appeler même des appels système dans certaines plates-formes.
os::sleep
et os::yield
à la plate-forme spécifique des choses.
Sur Linux et Windows: os::yield
semble être beaucoup plus simple que le os::sleep
.
Par exemple: os::yield
de Linux uniquement les appels sched_yield()
. Et os::sleep
ont environ 70 lignes de code.
rendement() indique la JVM Planificateur de Threads que c'est OK pour donner à d'autres threads tranches de temps. Habituellement, la JVM utilise cette appel pour activer un autre thread de la même la priorité de thread. Dans une bonne de préemption environnement multithreading, rendement() est un no-op. Cependant, il est important dans une coopérative environnement multithreading, depuis sans rendement(), un thread peut manger jusqu' tous les CPU.
sommeil(x) indique la JVM Fil Planificateur activement à mettre ce thread de dormir et de ne pas courir de nouveau, jusqu'à moins x millisecondes écoulées.
Ni le sommeil (de), ni de rendement() modifier rien sur le statut de verrous de synchronisation. Si votre fil a un verrou, et que vous appelez sleep(1000), ensuite, au moins un deuxième va s'écouler avant votre fil se réveille. Quand il se réveille, il peut décider de libérer le lock -- ou il peut tenir sur elle plus.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.