0
votes

comment est-ce que thread.sleep (retard) réagit aux filets parallèles réels

Le lien vers la documentation indique : Thread.sleep provoque la suspension du thread actuel de suspendre l'exécution pendant une période spécifiée

Qu'est-ce que le terme fil actuel signifie? Je veux dire que si le processeur n'a qu'un noyau qu'il ait logique de coïnser l'un des threads comme le fil de courant , mais si tous les threads (disent 4 d'entre eux) fonctionnent individuellement sur séparé Cores , alors lequel est le thread actuel ?


3 commentaires

Le thread actuel est celui qui exécute thread.sleep . Mais il semble que vous impliquiez que les fils et les cœurs ont une relation 1/1 ...


Il convient de dire que le nombre de cœurs a à peine quelque chose à voir avec le nombre de fils. Même sur un seul processeur principal, vous pouvez exécuter plusieurs applications en même temps, chacune avec son propre thread ou plusieurs threads.


"Actuellement" comme dans "celui qui exécute actuellement l'appel en cours de documentation". La sommeil fonctionne toujours sur le thread actuel, vous ne pouvez pas faire dormir un autre fil.


3 Réponses :


3
votes

Le "thread actuel" est le fil qui appelle thread.sleep (délai) .

Également si un fil dort, il ne bloque pas l'ensemble du noyau de la CPU. Un autre thread peut être exécuté sur le même noyau CPU pendant que votre fil est endormi.


0 commentaires

1
votes

Chaque commande de commande et de méthode que vous apportez doit être exécutée par n'importe quel thread. Dans la perspective de ce fil, c'est lui-même le fil actuel. Donc, en d'autres termes: thread.sleep (délai) pause le fil qui exécute le fil thread.sleep () méthode.

aussi, gardez à l'esprit que la multi-threading et plusieurs noyaux n'ont qu'une relation très lointaine.

Même avant que les processeurs multicœurs étaient courants, chaque système d'exploitation a appuyé le multi-threading lourd (ou multi-tâches multiples, qui est fondamentalement la même chose aux fins de cette discussion) Opération.

dans le système d'exploitation moderne, cela se fait avec une technique appelée Preemptif multitâche . Cela signifie fondamentalement que le système d'exploitation peut faire une pause de force le processus en cours d'exécution et permettre à un autre de courir pendant une courte période, en fournissant l'illusion d'un traitement parallèle réel.

Et depuis que beaucoup de temps dans un processus donné est souvent consacré à l'attente de certains E / S externes (réseau, disque, ...), ce qui signifie même que vous pouvez utiliser le processeur plus efficacement (depuis le moment où un processus serait un processus. Passez à attendre que l'IO Un autre processus puisse passer en calcul réel).

Par exemple au moment de la rédaction de cela, mon ordinateur portable a 1311 threads (dont la plupart dorment probablement et seulement une poignée sera réellement courir et / ou attendre de courir), même s'il n'a que 4 noyaux.

tl; dr tandis que plusieurs cœurs permettent plus d'un thread d'exécuter à exactement le même temps, vous pouvez avoir une multi-filetage même avec un noyau unique et il y a très peu de différence notable si vous le faites (outre les performances brutes, évidemment)


0 commentaires

1
votes

Le nom, "thread actuel", a été choisi pour la commodité des auteurs du système d'exploitation et non pour les auteurs d'applications qui doivent exécuter sous le système d'exploitation.

Dans le code source d'un système d'exploitation, il est logique d'avoir une variable actuelle_thread [cpu_id] qui pointe vers une structure de données décrivant le fil qui exécute sur ce CPU_ID < / code> à un moment donné.

Du point de vue d'un programmeur d'application, tout appel système censé faire quelque chose au "thread de courant", va le faire sur le fil qui fait appel à l'appel. Si un fil qui fonctionne sur CPU 3 appels thread.sleep (n) , le système d'exploitation recherchera actuel_thread [3] (c.-à-d. Le fil qui a apporté l'appel) et mettre ce fil à dormir.

du point de vue de l'application, thread.sleep (n) est une fonction qui apparaît ne ne prend rien n) millisecondes pour le faire.

En général, vous devez substituer "l'appelant" ou "le fil d'appel" à tout moment que vous voyez "thread actuel" dans n'importe quel document API.


0 commentaires