如何在 IntelliJ 中调试 multi-threaded 应用程序?
How to debug a multi-threaded app in IntelliJ?
我在 IntelliJ IDEA 14.0.2 中遇到多线程和断点的奇怪问题。断点后的代码在它停止之前被执行。
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
private static final int NUM_CLIENTS = 1000;
static class TestRunnable implements Runnable {
AtomicInteger lock;
@Override
public void run() {
synchronized (this.lock) {
int curCounter = this.lock.addAndGet(1);
System.out.println("Thread: " + Thread.currentThread().getName() + "; Count: " + curCounter);
if (curCounter >= NUM_CLIENTS) {
lock.notifyAll();
}
}
}
}
public static void main(final String args[]) {
final AtomicInteger lock = new AtomicInteger(0);
for (int i = 0; i < NUM_CLIENTS; i++) {
TestRunnable tr1 = new TestRunnable();
tr1.lock = lock;
new Thread(tr1).start();
}
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main woken up");
}
}
}
当我在第 12 行设置断点(Suspend All)时,synchronized (this.lock)
、System.out.println
仍然执行(有时会执行几次)。这是屏幕截图:
据我所知,所有线程都应该在断点处停止。
文档读起来令人困惑,但 this is the relevant block. 它提炼出来的是将 属性 设置为在线程上挂起,而不是整个应用程序。这将导致您在每个单独的线程而不是任意的、不确定的线程上达到断点。
- 暂停政策:全部
- 遇到断点时,所有线程都将暂停。
- 暂停策略:线程
- 当命中断点时,命中断点的线程被挂起。
我在 IntelliJ IDEA 14.0.2 中遇到多线程和断点的奇怪问题。断点后的代码在它停止之前被执行。
import java.util.concurrent.atomic.AtomicInteger;
public class Main {
private static final int NUM_CLIENTS = 1000;
static class TestRunnable implements Runnable {
AtomicInteger lock;
@Override
public void run() {
synchronized (this.lock) {
int curCounter = this.lock.addAndGet(1);
System.out.println("Thread: " + Thread.currentThread().getName() + "; Count: " + curCounter);
if (curCounter >= NUM_CLIENTS) {
lock.notifyAll();
}
}
}
}
public static void main(final String args[]) {
final AtomicInteger lock = new AtomicInteger(0);
for (int i = 0; i < NUM_CLIENTS; i++) {
TestRunnable tr1 = new TestRunnable();
tr1.lock = lock;
new Thread(tr1).start();
}
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main woken up");
}
}
}
当我在第 12 行设置断点(Suspend All)时,synchronized (this.lock)
、System.out.println
仍然执行(有时会执行几次)。这是屏幕截图:
据我所知,所有线程都应该在断点处停止。
文档读起来令人困惑,但 this is the relevant block. 它提炼出来的是将 属性 设置为在线程上挂起,而不是整个应用程序。这将导致您在每个单独的线程而不是任意的、不确定的线程上达到断点。
- 暂停政策:全部
- 遇到断点时,所有线程都将暂停。
- 暂停策略:线程
- 当命中断点时,命中断点的线程被挂起。