作者:mobiledu2502923977 | 来源:互联网 | 2023-05-28 12:31
我在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
当我在第12行放置一个断点(Suspend All)时synchronized (this.lock)
,System.out.println
仍然执行(有时几次).这是一个截图:
据我所知,所有线程都应该在断点处停止.
1> Makoto..:
文档令人困惑,但这是相关的块. 它提炼的内容是将属性设置为挂起线程,而不是整个应用程序.这将导致您在每个单独的线程上而不是任意的,不确定的线程中达到断点.
暂停政策:全部
当命中断点时,所有线程都被挂起.
暂停政策:线程
当命中断点时,挂起断点的线程被挂起.
实际上文档说:"全部 - 当一个断点被击中时,所有线程都被暂停".这正是我想要的行为.问题是一些线程,有时在断点被击中后继续执行,也许当IDEA停止第一个线程到达断点时.我认为这只是IDEA调试器或JVM上的一个错误.他们至少应该澄清文档上的行为,因为它完全是错误的,而不是混淆.
文档(针对2017.2)还描述了:"_某些情况下,IntelliJ IDEA不会在断点处停止.请考虑以下情况:在类的不同方法中设置两个断点,并将其挂起策略设置为All.其中一个断点被击中,执行了一些步骤操作.如果在步进另一个线程遇到第二个断点时,IntelliJ IDEA将不会停在那里._"
升级到2018.2后我仍然看到了这种行为.