Maison  >  Article  >  Java  >  Questions d'entretien sur les nouvelles Java 2020 - Multithreading (2)

Questions d'entretien sur les nouvelles Java 2020 - Multithreading (2)

王林
王林avant
2020-05-07 16:57:582022parcourir

Questions d'entretien sur les nouvelles Java 2020 - Multithreading (2)

1. Quels sont les statuts des discussions ?

Les threads ont généralement cinq états : créé, prêt, en cours d'exécution, bloqué et mort.

1. État de création

Lors de la génération d'un objet thread, la méthode de démarrage de l'objet n'est pas appelée. Cela signifie que le thread est dans l'état de création.

2. État prêt

Après avoir appelé la méthode de démarrage de l'objet thread, le thread entre dans l'état prêt, mais pour le moment, le planificateur de thread n'a pas défini le thread comme thread actuel. Il est maintenant prêt. Une fois le thread exécuté, il sera également à l'état prêt après son retour d'attente ou de veille.

3. État d'exécution

Le planificateur de thread définit le thread à l'état prêt comme thread actuel. À ce moment, le thread entre dans l'état d'exécution et commence à exécuter le code dans la fonction d'exécution. .

4. État de blocage

Lorsqu'un thread est en cours d'exécution, il est suspendu, généralement pour attendre un certain temps (par exemple, une certaine ressource est prête) avant de continuer à s'exécuter. La mise en veille, la suspension, l'attente et d'autres méthodes peuvent provoquer un blocage des threads.

5. État de mort

Si la méthode run d'un thread se termine ou si la méthode stop est appelée, le thread mourra. Pour un thread décédé, la méthode start ne peut plus être utilisée pour le préparer.

(Tutoriels vidéo associés recommandés : vidéo java)

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

1. sleep() : La méthode est une méthode statique de la classe thread (Thread), qui met le thread appelant en état de veille et donne la possibilité d'exécution à d'autres threads après le temps de veille. est terminé, le thread devient prêt. L'état est en compétition avec d'autres threads pour le temps d'exécution du processeur. Parce que sleep() est une méthode statique, elle ne peut pas modifier le verrouillage machine de l'objet. Lorsque la méthode sleep() est appelée dans un bloc synchronisé, même si le thread se met en veille, le verrouillage machine de l'objet n'est pas libéré et les autres threads ne le peuvent toujours pas. accéder à cet objet.

2. wait() : wait() est une méthode de la classe Object Lorsqu'un thread exécute la méthode wait, il entre dans un pool d'attente lié à l'objet et libère en même temps le verrou machine de l'objet. . Pour permettre l'accès à d'autres threads, vous pouvez réveiller les threads en attente via les méthodes notify et notifyAll.

3. Quelle est la différence entre notify() et notifyAll() ?

Si un thread appelle la méthode wait() d'un objet, le thread sera dans le pool d'attente de l'objet et les threads du pool d'attente ne seront pas en compétition pour le verrou de l'objet.

Lorsqu'un thread appelle la méthode notifyAll() de l'objet (réveille tous les threads d'attente) ou la méthode notify() (réveille un seul thread d'attente de manière aléatoire), le thread réveillé entrera dans le pool de verrouillage de l'objet, les threads dans le pool de verrouillage seront en compétition pour le verrouillage de l'objet. C'est-à-dire qu'après avoir appelé notify, un seul thread entrera dans le pool de verrouillage à partir du pool d'attente, et notifyAll déplacera tous les threads du pool d'objets en attente vers le pool de verrouillage pour attendre la concurrence de verrouillage.

Les threads avec une priorité élevée ont une forte probabilité d'être en compétition pour le verrouillage d'objet. Si un thread n'est pas en compétition pour le verrouillage d'objet, il restera dans le pool de verrouillage uniquement lorsque le thread appelle la méthode wait(). encore une fois, peut-il retourner dans la piscine d'attente. Le thread en compétition pour le verrouillage d'objet continuera à s'exécuter jusqu'à ce que le bloc de code synchronisé soit exécuté, et il libérera le verrouillage d'objet. À ce moment, les threads du pool de verrouillage continueront à rivaliser pour le verrouillage d'objet.

4. Quelle est la différence entre thread run() et start() ?

Chaque thread termine son opération via la méthode run() correspondant à un objet Thread spécifique. La méthode run() est appelée le corps du thread. Démarrez un thread en appelant la méthode start() de la classe Thread.

méthode start() pour démarrer un thread, réalisant véritablement une opération multithread. À ce stade, il n'est pas nécessaire d'attendre que le code du corps de la méthode d'exécution soit exécuté, et vous pouvez directement continuer à exécuter le code suivant à ce moment, le thread est dans l'état prêt et n'est pas en cours d'exécution ; Appelez ensuite la méthode run() via cette classe Thread pour terminer son état d'exécution. La méthode run() est ici appelée le corps du thread, qui contient le contenu du thread à exécuter. La méthode Run se termine et le thread se termine. Le CPU planifie ensuite d'autres threads.

La méthode run() est dans ce fil. C'est juste une fonction dans le fil, pas multithread. Si vous appelez run() directement, cela équivaut en fait à appeler une fonction ordinaire. Si vous utilisez directement la méthode run(), vous devez attendre que la méthode run() termine son exécution avant d'exécuter le code suivant. il n'y a toujours qu'un seul chemin d'exécution et il n'y a aucune caractéristique de thread, donc la méthode start() doit être utilisée à la place de la méthode run() lors d'une exécution multi-thread.

(Tutoriel recommandé : Programme de démarrage Java )

5. Quelles sont les manières de créer un pool de threads ?

1. newFixedThreadPool(int nThreads)

Créez un pool de threads de longueur fixe et créez un thread chaque fois qu'une tâche est soumise jusqu'à ce que le nombre maximum de pools de threads soit atteint. cette fois, la taille du thread ne changera plus. Lorsqu'un thread se termine en raison d'une erreur inattendue, le pool de threads ajoute un nouveau thread.

2. newCachedThreadPool()

Créez un pool de threads pouvant être mis en cache. Si la taille du pool de threads dépasse la demande de traitement, les threads inactifs seront automatiquement recyclés lorsque la demande augmente, de nouveaux threads peuvent être automatiquement ajoutés. .

3. newSingleThreadExecutor()

Il s'agit d'un exécuteur à thread unique. Il crée un seul thread de travail pour effectuer des tâches. Si ce thread se termine anormalement, un nouveau sera créé pour le remplacer. ; it La caractéristique est qu'il peut assurer une exécution en série selon l'ordre des tâches dans la file d'attente.

4. newScheduledThreadPool(int corePoolSize)

Crée un pool de threads de longueur fixe et exécute des tâches de manière retardée ou planifiée, similaire à Timer.

Pour plus de questions d'entretien, veuillez faire attention à la colonne questions d'entretien Java.

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