Java Thread Priority <r /> O tipo especial de erro relacionado à multitarefa que precisa ser evitado é o impasse. O impasse ocorre quando dois threads têm uma dependência circular de um par de objetos síncronos. Por exemplo, suponha que um encadeamento entre no pipeline do objeto X e outro thread entra no pipeline do objeto Y. Se o thread de X tentar chamar o método de sincronização de Y, ele será bloqueado conforme o esperado. O Thread Y também deseja chamar alguns métodos de sincronização de X, e o thread espera para sempre, porque, para atingir o X, ele deve liberar seu próprio bloqueio de y para concluir o primeiro thread. Deadlock é um erro muito difícil de depurar porque:
Geralmente, isso acontece raramente e só acontece quando o período dos dois threads corresponde.
Ele pode conter mais de dois threads e objetos síncronos (ou seja, os deadlocks podem ocorrer quando há sequências de eventos mais complexas do que o exemplo descrito).
Para entender completamente o impasse, é útil observar seu comportamento. O exemplo a seguir gera duas classes, A e B, com métodos Foo () e Bar (), respectivamente. Esses dois métodos têm uma breve pausa antes de chamar métodos de outras classes. A classe principal, denominada Deadlock, cria instâncias de A e B e, em seguida, inicia um segundo fio para configurar um ambiente de impasse. Os métodos Foo () e Bar () usam Sleep () para forçar o impasse.
// Um exemplo de deadlock.class a {sincronizado void foo (b b) {string name = thread.currentThread (). GetName (); Thread .Sleep (1000); (); System.out.println (Nome + "Digite B.Bar"); n (Nome + "Tentando A.Last ()"); {A a = novo a (); (); Obtenha bloqueio B em outro thread. Depois de executar o programa, a saída é a seguinte:
MainThread entrou no A.FoorAcacingThread entrou no B.BarmAnthread tentando chamar B.Last () RacingThread tentando ligar para A.Last ()
Como o programa está implementado, você precisa pressionar o CTRL-C para encerrar o programa. Pressione Ctrl-Break no PC (ou pressione Ctrl-/ Under Solaris) e você pode ver o encadeamento completo e a pilha de buffer de tubulação. Você verá que o RacingThread ocupa o processo de gerenciamento B enquanto aguarda o processo de gerenciamento A e, ao mesmo tempo, MainThread ocupa uma espera pelo processo de gerenciamento b. O programa nunca terminará. Como este exemplo ilustra, seu programa multithread é frequentemente bloqueado e o impasse é o primeiro problema que você deve verificar.
Java Thread Deadlock <r /> O tipo especial de erro relacionado à multitarefa que precisa ser evitado é o impasse. O impasse ocorre quando dois threads têm uma dependência circular de um par de objetos síncronos. Por exemplo, suponha que um encadeamento entre no pipeline do objeto X e outro thread entra no pipeline do objeto Y. Se o thread de X tentar chamar o método de sincronização de Y, ele será bloqueado conforme o esperado. O Thread Y também deseja chamar alguns métodos de sincronização de X, e o thread espera para sempre, porque, para atingir o X, ele deve liberar seu próprio bloqueio de y para concluir o primeiro thread. Deadlock é um erro muito difícil de depurar porque:
Geralmente, isso acontece raramente e só acontece quando o período dos dois threads corresponde.
Ele pode conter mais de dois threads e objetos síncronos (ou seja, os deadlocks podem ocorrer quando há sequências de eventos mais complexas do que o exemplo descrito).
Para entender completamente o impasse, é útil observar seu comportamento. O exemplo a seguir gera duas classes, A e B, com métodos Foo () e Bar (), respectivamente. Esses dois métodos têm uma breve pausa antes de chamar métodos de outras classes. A classe principal, denominada Deadlock, cria instâncias de A e B e, em seguida, inicia um segundo fio para configurar um ambiente de impasse. Os métodos Foo () e Bar () usam Sleep () para forçar o impasse.
// Um exemplo de deadlock.class a {sincronizado void foo (b b) {string name = thread.currentThread (). GetName (); Thread .Sleep (1000); (); System.out.println (Nome + "Digite B.Bar"); n (Nome + "Tentando A.Last ()"); {A a = novo a (); (); Obtenha bloqueio B em outro thread. Depois de executar o programa, a saída é a seguinte:
MainThread entrou no A.FoorAcacingThread entrou no B.BarmAnthread tentando chamar B.Last () RacingThread tentando ligar para A.Last ()
Como o programa está implementado, você precisa pressionar o CTRL-C para encerrar o programa. Pressione Ctrl-Break no PC (ou pressione Ctrl-/ Under Solaris) e você pode ver o encadeamento completo e a pilha de buffer de tubulação. Você verá que o RacingThread ocupa o processo de gerenciamento B enquanto aguarda o processo de gerenciamento A e, ao mesmo tempo, MainThread ocupa uma espera pelo processo de gerenciamento b. O programa nunca terminará. Como este exemplo ilustra, seu programa multithread é frequentemente bloqueado e o impasse é o primeiro problema que você deve verificar.