Depuração de Tópicos IntelliJ

O IntelliJ IDEA fornece debugging de threads? Ou seja, o NetBeans permite depurar vários threads e parar nesses pontos de interrupção (automaticamente). No entanto, tudo o que parece estar recebendo no IntelliJ é “thread dumping”, que parece ser uma análise que é manual, e um instantâneo obtido quando eu cliquei em “Thread Dump”.

Tem algo que estou perdendo? Eu tenho google’d e não encontrei informações suficientes para ajudar.

Eu acho que você pode. Eu suspendi threads através de pontos de interrupção, definindo a política de suspensão . Isso irá suspender o thread que está executando este pedaço de código. Se você tem vários tópicos, então eu acho que eles continuariam.

Para citar a política de suspensão

  • descrição do item
  • Todos: Quando o ponto de interrupção é atingido, todos os tópicos são suspensos
  • Tópico: Quando o ponto de interrupção é atingido, o encadeamento onde o ponto de interrupção é atingido é suspenso.
  • Nenhum: nenhum thread está suspenso.

Você tem uma boa visão de Threads disponível.

Pressione a pequena roda dentada e você verá todos os segmentos ativos.

insira a descrição da imagem aqui

E em cada ponto de interrupção, você pode definir a política de suspensão. Você pode tornar a alternativa Thread o padrão para todos os pontos de interrupção ou você pode configurá-los individualmente em cada ponto de interrupção.

insira a descrição da imagem aqui

Para mim, o problema de não acessar o thread ainda ocorre. Eu montei pontos de brakes para todos. E coloque os pontos de brak dentro dos methods de chamada. O que eu notei é que o método em um novo thread está sendo acessado quando eu chamo run () mas não start (). Basta saber por que, AFAIK o método start () deve chamar run (). No entanto, a saída do thread ocorre até mesmo eu chamo .start (), mas nunca o access.

Para mim, o problema era que parece haver uma condição de corrida com a continuação dos encadeamentos após os pontos de interrupção e a avaliação dos pontos de interrupção no IntelliJ.

Meu trabalho de curto prazo foi não definir pontos de interrupção antes de eu gerar um thread. Se eu não fizer isso, os primeiros pontos de interrupção no run () ou no call () serão perdidos.

Eu acho que o problema que você tem é que os threads filho estão sendo fechados mais cedo do que o esperado porque o thread principal ( o teste em si ) chega ao fim.

Lembre-se que quando você faz um Thread.start () uma chamada assíncrona é iniciada, então se você estiver executando seus testes usando Junit a execução continuará após esta chamada até o final do teste, e assim que ela chegar ao final, fecha os tópicos que você começou dentro dele.

Portanto, se você tem algo como:

 01. import org.junit.Assert; 02. import org.junit.Test; 03. public class ThreadTest { 04. static boolean didIGetIt = false; 05. @Test 06. public void testThread() { 07. Thread myThread = new Thread(new Runnable() { 08. @Override 09. public void run() { 10. System.out.println("I am an asynchronous task"); 11. System.out.println("and JUnit won't wait for me to finish my job!"); 12. didIGetIt = true; 13. } 14. }); 15. myThread.start(); 16. Assert.assertTrue(didIGetIt); 17. } 18. } 

Ele executará o Assert antes do código dentro do run (), levando a um teste de falha.

Mas se você adicionar um sono simples, poderá interromper o thread principal e depurar e fazer o que for necessário antes que o thread principal pare.

 01. import org.junit.Assert; 02. import org.junit.Test; 03. public class ThreadTest { 04. static boolean didIGetIt = false; 05. @Test 06. public void testThread() throws InterruptedException { 07. Thread myThread = new Thread(new Runnable() { 08. @Override 09. public void run() { 10. System.out.println("I am an asynchronous task"); 11. System.out.println("and JUnit won't wait for me to finish my job!"); 12. didIGetIt = true; 13. } 14. }); 15. myThread.start(); 16. System.out.println("Let's wait for child threads to finish"); 17. Thread.sleep(5000); 18. Assert.assertTrue(didIGetIt); 19. } 20. } 

Certamente existem maneiras melhores de fazê-lo, mas o Thread.sleep pode ser o que você está procurando.

Espero que possa ajudar alguém!