Priorité de thread Java <br /> Le type spécial d'erreur lié au multitâche qui doit être évité est l'impasse. L'impasse se produit lorsque deux threads ont une dépendance circulaire sur une paire d'objets synchrones. Par exemple, supposons qu'un thread entre dans le pipeline de l'objet X et qu'un autre thread entre dans le pipeline de l'objet Y. Si le thread de X essaie d'appeler la méthode de synchronisation de Y, il sera verrouillé comme prévu. Le thread Y veut également appeler certaines méthodes de synchronisation de X, et le thread attend pour toujours, car pour atteindre X, il doit libérer son propre verrou de Y pour rendre le premier thread complet. L'impasse est une erreur très difficile à déboguer car:
Habituellement, cela se produit rarement, et cela ne se produit que lorsque la période de temps des deux fils correspond.
Il peut contenir plus de deux threads et d'objets synchrones (c'est-à-dire que des impasses peuvent se produire lorsqu'il y a plus de séquences d'événements complexes que l'exemple qui vient d'être décrit).
Pour bien comprendre l'impasse, il est utile d'observer son comportement. L'exemple suivant génère deux classes, A et B, avec des méthodes FOO () et BAR () respectivement. Ces deux méthodes ont une brève pause avant d'appeler les méthodes d'autres classes. La classe principale, nommée impasse, crée des instances de A et B, puis démarre un deuxième thread pour configurer un environnement de blocage. Les méthodes foo () et bar () utilisent le sommeil () pour forcer l'impasse.
// un exemple de dalking.class a {synchronisé void foo (b b) {string name = thread.currentThread (). GetName (); Thread .Sleep (1000);} Catch (exception e) {System.out.println ("A interrompu");} System.out.println (Name + "Essayant d'appeler B.Last ()"); ();} synchronisé void Last () {System.out.println ("Inside A.Last");}} classe B {Synchronised Void Bar (A) {String Name = Thread.CurrentThread () .getName (); System .out.println (Name + "Entré B.BAR"); n (name + "Essayant d'appeler A.Last ()"); {A a = new a (); b b = new b (); (); Obtenez un verrouillage sur B dans un autre thread. Après avoir exécuté le programme, la sortie est la suivante:
Mainthread est entré a.fooracingthread est entré B.BarmainThread en essayant d'appeler B.Last () RacingThread en essayant d'appeler A.Last ()
Parce que le programme est imprégné, vous devez appuyer sur CTRL-C pour mettre fin au programme. Appuyez sur CTRL-CUPER sur le PC (ou appuyez sur Ctrl- / sous Solaris) et vous pouvez voir le fil complet et le tas de tampon de pipeline. Vous verrez que RacingThread occupe le processus de gestion B en attendant le processus de gestion A, et en même temps, Mainthread occupe une attente du processus de gestion b. Le programme ne se terminera jamais. Comme cet exemple l'illustre, votre programme multithread est souvent verrouillé et l'impasse est le premier problème que vous devez vérifier.
Impate de thread Java <br /> Le type spécial d'erreur lié au multitâche qui doit être évité est l'impasse. L'impasse se produit lorsque deux threads ont une dépendance circulaire sur une paire d'objets synchrones. Par exemple, supposons qu'un thread entre dans le pipeline de l'objet X et qu'un autre thread entre dans le pipeline de l'objet Y. Si le thread de X essaie d'appeler la méthode de synchronisation de Y, il sera verrouillé comme prévu. Le thread Y veut également appeler certaines méthodes de synchronisation de X, et le thread attend pour toujours, car pour atteindre X, il doit libérer son propre verrou de Y pour rendre le premier thread complet. L'impasse est une erreur très difficile à déboguer car:
Habituellement, cela se produit rarement, et cela ne se produit que lorsque la période de temps des deux fils correspond.
Il peut contenir plus de deux threads et d'objets synchrones (c'est-à-dire que des impasses peuvent se produire lorsqu'il y a plus de séquences d'événements complexes que l'exemple qui vient d'être décrit).
Pour bien comprendre l'impasse, il est utile d'observer son comportement. L'exemple suivant génère deux classes, A et B, avec des méthodes FOO () et BAR () respectivement. Ces deux méthodes ont une brève pause avant d'appeler les méthodes d'autres classes. La classe principale, nommée impasse, crée des instances de A et B, puis démarre un deuxième thread pour configurer un environnement de blocage. Les méthodes foo () et bar () utilisent le sommeil () pour forcer l'impasse.
// un exemple de dalking.class a {synchronisé void foo (b b) {string name = thread.currentThread (). GetName (); Thread .Sleep (1000);} Catch (exception e) {System.out.println ("A interrompu");} System.out.println (Name + "Essayant d'appeler B.Last ()"); ();} synchronisé void Last () {System.out.println ("Inside A.Last");}} classe B {Synchronised Void Bar (A) {String Name = Thread.CurrentThread () .getName (); System .out.println (Name + "Entré B.BAR"); n (name + "Essayant d'appeler A.Last ()"); {A a = new a (); b b = new b (); (); Obtenez un verrouillage sur B dans un autre thread. Après avoir exécuté le programme, la sortie est la suivante:
Mainthread est entré a.fooracingthread est entré B.BarmainThread en essayant d'appeler B.Last () RacingThread en essayant d'appeler A.Last ()
Parce que le programme est imprégné, vous devez appuyer sur CTRL-C pour mettre fin au programme. Appuyez sur CTRL-CUPER sur le PC (ou appuyez sur Ctrl- / sous Solaris) et vous pouvez voir le fil complet et le tas de tampon de pipeline. Vous verrez que RacingThread occupe le processus de gestion B en attendant le processus de gestion A, et en même temps, Mainthread occupe une attente du processus de gestion b. Le programme ne se terminera jamais. Comme cet exemple l'illustre, votre programme multithread est souvent verrouillé et l'impasse est le premier problème que vous devez vérifier.