64 votes

Les instructions Thread.sleep (0) et Thread.yield () sont-elles équivalentes?

Ces deux déclarations sont-elles équivalentes?

 Thread.sleep(0);
Thread.yield();
 

45voto

Michael Borgwardt Points 181658

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.

32voto

z - Points 5610

Yield ajoute le thread actuel à la file d'attente disponible et permet à d'autres threads de s'exécuter. Le sommeil n'est pas garanti pour abandonner le processeur.

30voto

Neil Coffey Points 13408

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.)

13voto

User1 Points 3826

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.

10voto

Roberto Aloi Points 13132

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.

SOURCE: http://www.jguru.com/faq/view.jsp?EID=425624

Prograide.com

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.

Powered by:

X