JavaRush /Blog Java /Random-FR /Niveau 25. Réponses aux questions d'entretien sur le suje...
zor07
Niveau 31
Санкт-Петербург

Niveau 25. Réponses aux questions d'entretien sur le sujet du niveau

Publié dans le groupe Random-FR
Niveau 25. Réponses aux questions d'entretien sur le thème du niveau - 1
  1. Quels sont tous les états de l'objet Thread?

    • NOUVEAU
    • EXÉCUTIF
    • BLOQUÉ
    • EN ATTENDANT
    • TIMED_WAITING
    • TERMINÉ
  2. Dans quels états un thread peut-il passer lorsqu'il entre dans un bloc synchronized?

    • EXÉCUTIF
    • BLOQUÉ

    En RUNNABLE, si le bloc de code marqué synchronizedn'est pas occupé par un autre thread. Sinon, notre thread recevra l'état BLOCKED et attendra que l'objet mutex soit libéré.

  3. Dans quel état le thread ira-t-il lors de l'appel de la méthode wait()?

    L’appel de cette méthode place le thread dans l’état WAITING.
    La méthode wait()ne peut être appelée qu'à l'intérieur d'un bloc synchronizedsur un objet mutex qui a été « verrouillé » par le thread actuel, sinon la méthode lèvera une exception IllegalMonitorStateException .

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    Lorsqu'une méthode est appelée wait(), le thread actuel libère le verrou de l'objet monitoret entre dans l'état WAITING, en attendant que la méthode soit appelée monitor.notify()par monitor.notifyAll()un autre thread. Dès que cela se produit, le thread se réveillera et si le moniteur n'était pas occupé, il le récupérera et continuera à fonctionner.
    Si le moniteur est occupé par un autre thread, le thread actuel passera à l'état BLOCKED.

  4. Dans quel état le thread ira-t-il lors de l'appel de la méthode wait(500)?

    L’appel de cette méthode place le thread dans l’état TIMED_WAITING.
    Par analogie avec la méthode wait(), wait(timeout)elle ne peut être appelée qu'à l'intérieur d'un bloc synchronizedsur un objet mutex qui a été « verrouillé (verrouillé) » par le thread courant.

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait(500);}

    Lors de l'appel de la méthode wait(), le thread actuel libère le verrou de l'objet monitoret se met en veille pendant 500 millisecondes. L'objet monitorpeut être capturé par un autre thread.
    Après 500 millisecondes, le thread se réveillera et s'il monitorn'était pas occupé, il le récupérera et continuera à fonctionner.
    Si le moniteur est occupé par un autre thread, le thread actuel passera à l'état BLOCKED.

    Dans quel état le thread ira-t-il lors de l'appel de la méthode notify()?

    Object monitor = getMonitor();
    synchronized(monitor)
    {
     …
     monitor.wait();}

    Après monitor.wait(), le thread passera à l'état WAITING. Une méthode notify()appelée par un autre thread sur un objet monitordéplacera le thread de l'état WAITING à l'état RUNNABLE sauf si l'objet moniteur est capturé par un autre thread, sinon à l'état BLOCKED.

  5. Dans quel état le thread ira-t-il lors de l'appel de la méthode notifyAll()?

    notifyAll()"restera" tous les fils de discussion. L'un de tous les threads "en veille" (WAITING) passera à l'état RUNNABLE, prendra le contrôle du moniteur de l'objet utilisé et poursuivra son travail. Le reste sera à l’état BLOQUÉ. Dès que le premier thread de « réveil » libère le moniteur, ce que tout le monde attend, son sort sera répété par le thread suivant (un thread arbitraire passera de l'état BLOCKED à l'état RUNNABLE). Cela continuera jusqu'à ce que tous les threads « réveillés » quittent l'état BLOQUÉ.

  6. Trois threads dans le bloc synchronisé appelés wait()l'objet mutex. Dans quel état ces threads iront-ils si le quatrième thread appellenotifyAll() ?

    Deux d'entre eux passeront à l'état BLOQUÉ, un à l'état RUNNABLE.

  7. En quoi est-ce différent join(500)de wait(500)?

    Malgré le fait que et join(500)fera wait(500)passer le thread actuel à l'état TIMED_WAITING, il existe des différences significatives entre eux :
    join(500)appelé sur un thread, wait(500)appelé à l'intérieur d'un bloc synchronisé sur l'objet sur lequel ce bloc est synchronisé.
    Lorsqu'il est appelé, join(500)le thread actuel attendra 500 millisecondes pour que le thread dont la méthode join()a été appelée se termine.
    Lorsqu'il est appelé, wait(500)le thread actuel libère le verrou de l'objet synchronisé et se met en veille pendant 500 millisecondes.
    Après 500 millisecondes, dans les deux cas, les threads continueront à fonctionner.

  8. En quoi est-ce différent wait(500)de sleep(500)?

    sleep(500)appelé sur un thread, wait(500)appelé à l'intérieur d'un bloc synchronisé sur l'objet sur lequel ce bloc est synchronisé.
    Lorsqu'il est appelé, sleep(500)le thread actuel attendra 500 millisecondes, puis continuera son travail.
    Lorsqu'il est appelé, wait(500)le thread actuel libère le verrou de l'objet synchronisé et se met en veille pendant 500 millisecondes.

  9. Dans quel état le thread ira-t-il lors de l'appel de la méthode yield()?

    Lorsqu'une méthode est appelée yield(), le thread actuel « saute son tour » et Java passe immédiatement à l'exécution du thread suivant. Le fil passe d'un runningétat à l'autre ready. Les états en cours d'exécution et prêt sont des sous-états de l'état RUNNABLE.

PS Les commentaires, ajouts, corrections, remarques sont les bienvenus =)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION