Подтвердить что ты не робот

IntelliJ Thread Debug

Обеспечивает ли IntelliJ IDEA отладку от потока? То есть - Netbeans позволяет вам отлаживать несколько потоков и останавливаться на этих контрольных точках (автоматически). Однако все, что я, кажется, получаю в IntelliJ, это "демпинг потоков", который, как представляется, является анализом, который является ручным, и снимок, сделанный, когда я щелкнул "Дамп потока".

Есть ли что-то, что мне не хватает? У меня есть google'd и не найдено достаточной информации для оказания помощи.

4b9b3361

Ответ 1

Думаю, ты сможешь. Я приостановил потоки через точки останова, установив приостановить политику. Это приостановит поток, выполняющий этот фрагмент кода. Если у вас несколько потоков, я бы подумал, что они будут продолжать.

Чтобы указать политику приостановки

  • Элемент Описание
  • Все: при ударе точки останова все потоки приостановлены.
  • Тема: Когда ударяется точка останова, поток, на который ударяется точка останова, приостанавливается.
  • Нет: нить не приостановлена.

Ответ 2

У вас есть хороший Threads вид.

Нажмите небольшое колесо, и вы увидите все активные потоки.

enter image description here

И на каждой точке останова вы можете установить политику приостановки. Вы можете либо сделать альтернативу Thread по умолчанию для всех точек останова, либо вы можете установить их отдельно на каждой точке останова.

enter image description here

Ответ 3

Для меня проблема с отсутствием доступа к потоку все еще оккупирует. Я установил brakepoints для всех. И поставьте brakepoints внутри методов вызова. Я заметил, что метод в новом потоке доступен, когда я вызываю run(), но не start(). Просто интересно, почему, AFAIK метод start() должен вызвать run(). Тем не менее, выход из потока происходит даже я вызываю .start(), но никогда не получаю его.

Ответ 4

Для меня проблема заключалась в том, что, похоже, существует условие гонки с возобновлением потоков после точек останова и оценка точек останова в IntelliJ.

Моя краткосрочная работа заключалась в том, чтобы не устанавливать точки останова прямо перед тем, как я создаю нить. Если я этого не сделаю, первые несколько точек останова в run() или call() будут пропущены.

Ответ 5

Я думаю, что проблема заключается в том, что дочерние потоки закрываются раньше, чем вы ожидали, потому что основной поток (сам тест) доходит до конца.

Помните, что когда вы запускаете асинхронный вызов Thread.start(), тогда, если вы используете свои тесты с помощью Junit, выполнение будет продолжаться после этого вызова до конца теста и как только оно достигнет end, он отключает потоки, которые вы начали внутри него.

Поэтому, если у вас есть что-то вроде:

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. }

Он выполнит Assert перед кодом внутри run(), ведущим к отказу.

Но если вы добавите простой сон, вы можете остановить основной поток и отладить и сделать то, что вам нужно, до остановки основного потока.

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 wait for child threads to finish");
17.         Thread.sleep(5000);
18.         Assert.assertTrue(didIGetIt);
19.     }
20. }

Конечно, есть лучшие способы сделать это, но Thread.sleep может быть тем, что вы ищете.

Надеюсь, это может помочь кому-то!