Maison  >  Article  >  Java  >  Quelle est la différence entre sleep() et wait() ?

Quelle est la différence entre sleep() et wait() ?

云罗郡主
云罗郡主avant
2018-10-15 13:55:203347parcourir

Le contenu de cet article concerne sleep() et wait(). Quelles sont les différences entre eux ? , a une certaine valeur de référence, les amis dans le besoin peuvent s'y référer, j'espère que cela vous sera utile.

Quelle est la différence entre sleep() et wait().

sleep est une méthode de la classe thread (Thread), qui amène ce thread à suspendre l'exécution pendant une durée spécifiée et à donner des opportunités d'exécution à d'autres threads, mais l'état de surveillance est toujours maintenu et reprendra automatiquement lorsque le le temps vient. L’appel de sleep ne libère pas le verrouillage de l’objet. wait est une méthode de la classe Object. L'appel de la méthode wait sur cet objet amène ce thread à abandonner le verrouillage de l'objet et à entrer dans le pool de verrouillage en attente pour cet objet. Ce n'est qu'après l'émission de la méthode notify ou notifyAll pour cet objet. Le thread entre dans le pool de verrouillage d'objet et se prépare à l'obtenir. Le verrou d'objet entre dans l'état d'exécution.

Lorsqu'un thread entre dans une méthode synchronisée d'un objet, si d'autres threads peuvent entrer d'autres méthodes de cet objet.

Les autres threads ne peuvent accéder qu'à d'autres méthodes non synchronisées de l'objet, et les méthodes synchronisées ne peuvent pas y entrer.

Quelles sont les méthodes de synchronisation des threads ?

wait() : met un thread en état d'attente et libère le verrou de l'objet qu'il détient ;

sleep() : met un thread en cours d'exécution dans un état de veille, qui est un état statique Méthode, appelez cette méthode pour intercepter l'exception InterruptedException ;

notify() : réveille un thread en état d'attente. Notez que lorsque vous appelez cette méthode, vous ne pouvez pas exactement réveiller un thread en état d'attente. détermine quel thread réveiller, et non par priorité ;

notifyAll() : réveille tous les threads en attente. Notez que tous les threads réveillés ne reçoivent pas de verrou d'objet, mais sont autorisés à entrer en compétition.

Il existe plusieurs méthodes d'implémentation pour le multi-threading et plusieurs méthodes d'implémentation pour la synchronisation.

Il existe deux façons d'implémenter le multithreading, à savoir hériter de la classe Thread et implémenter l'interface Runnable ;

Il existe deux façons d'implémenter la synchronisation, à savoir synchronisé, attendre et notifier ;

Quelles sont les similitudes et les différences entre la synchronisation et l'asynchronisme, et dans quelles circonstances sont-elles utilisées ?

Si les données seront partagées entre les fils de discussion. Par exemple, les données en cours d'écriture peuvent être lues par un autre thread à l'avenir, ou les données qui ont été lues ont été écrites par d'autres données, ces données sont alors des données partagées et doivent être accessibles de manière synchrone. La programmation asynchrone doit être utilisée lorsque l'application appelle une méthode qui prend beaucoup de temps à s'exécuter et ne souhaite pas que le programme attende le retour de la méthode. Dans de nombreux cas, l'approche asynchrone est souvent plus efficace.

Utilisez run() ou start() pour démarrer un fil de discussion.

Démarrer un thread consiste à appeler la méthode start() pour rendre la machine virtuelle représentée par le thread dans un état exécutable, ce qui signifie qu'elle peut être planifiée et exécutée par la JVM. Cela ne signifie pas que le. le fil s'exécutera immédiatement. La méthode run() peut arrêter un thread en générant un indicateur de sortie obligatoire.

Les concepts de base des threads, les états de base des threads et la relation entre les états.

Un thread fait référence à une unité d'exécution qui peut exécuter le code du programme pendant l'exécution. Chaque programme a au moins un thread, qui est le programme lui-même

Il existe quatre types de threads en Java ; les statuts sont : en cours d’exécution, prêt, suspendu et terminé.

Décrivez brièvement les similitudes et les différences entre synchronisé et java.util.concurrent.locks.Lock.

Principales similitudes : Lock peut compléter toutes les fonctions implémentées par synchronisé ;

Principales différences : Lock a une sémantique de thread plus précise et de meilleures performances que synchronisé. synchronisé libérera automatiquement le verrou, mais Lock doit exiger que le programmeur le libère manuellement, et il doit être libéré dans la clausefinal.

De combien de façons pouvez-vous implémenter un thread en Java ? Quels mots-clés sont utilisés pour modifier les méthodes de synchronisation ? Pourquoi stop() et suspend() sont-ils obsolètes ?

Il existe deux méthodes d'implémentation, qui consistent à hériter de Thread et à implémenter l'interface Runnable ;

modifier la méthode de synchronisation avec synchronisé

s'opposer à l'utilisation de stop() car c'est dangereux. Il libère tous les verrous acquis par les threads, et si les objets sont dans un état incohérent, d'autres threads peuvent les inspecter et les modifier dans cet état. Il est donc difficile de détecter le véritable problème.

La méthode suspend() est sujette aux blocages. Lorsque suspend() est appelé, le thread cible s'arrêtera, mais il détient toujours le verrou acquis auparavant. À ce stade, aucun autre thread ne peut accéder à la ressource verrouillée à moins que le thread « suspendu » ne reprenne son fonctionnement. Pour n'importe quel thread, s'ils souhaitent reprendre le thread cible et essayer d'utiliser n'importe quelle ressource verrouillée en même temps, un blocage se produira. Par conséquent, vous ne devez pas utiliser suspend(), mais mettre un indicateur dans votre classe Thread pour indiquer si le thread doit être actif ou suspendu. Si l'indicateur indique que le thread doit être suspendu, utilisez wait() pour lui ordonner d'entrer dans l'état d'attente. Si l'indicateur indique que le thread doit être repris, utilisez un notify() pour redémarrer le thread.

Ce qui précède est une introduction complète aux différences entre sleep() et wait(). Si vous souhaitez en savoir plus sur les Tutoriels vidéo Java, veuillez faire attention. vers le site Web chinois PHP.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer