Интересно!
Я играл с некоторым исходным кодом, чтобы увидеть, что происходит с условной точкой останова и без нее. Прилагается ниже.
Выполнение в отладчике с условной точкой останова:
Продолжительность: 1210623 микросекунд
Выполнение в отладчике без условной точки останова:
Продолжительность: 24 мкс
ИМХО, ВМ не остановлена, поскольку второй поток продолжает работать рядом. Eclipse должен внедрить код точки останова в текущий класс. Возможно, это происходит при каждом вызове, и, возможно, приходится перекомпилировать класс при каждом вызове. Проверка источников Eclipse покажет, что именно происходит.
Мой опыт работы с условными контрольными точками в C # и в Visual Studio еще хуже: у меня такое чувство, что все на пару порядков хуже.
public class BreakPointPlay {
static int breakpointHits;
static volatile int modifiedBySecondThread;
static volatile boolean stopped;
public static void main(String[] args) throws InterruptedException {
Thread secondThread = startSecondThread();
final long LOOPS = 1000;
long counter = 0;
long start = System.nanoTime();
for (long i = 0; i < LOOPS; i++) {
// place breakpoint here and set the condition to the
// #breakPointCondition() method.
counter += i;
}
long stop = System.nanoTime();
long nanos = stop - start;
long micros = nanos / 1000;
System.out.println("\nDuration: " + micros + " microseconds\n");
printInfo();
stopped = true;
secondThread.join();
}
private static Thread startSecondThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while(! stopped){
modifiedBySecondThread++;
}
}
});
thread.start();
return thread;
}
private static void printInfo() {
printModifiedBySecondThread();
printThread();
printClassLoader();
printStackTrace();
printModifiedBySecondThread();
}
private static void printStackTrace() {
Exception exception = new Exception();
exception.fillInStackTrace();
exception.printStackTrace(System.out);
}
private static void printModifiedBySecondThread() {
print("modifiedBySecondThread " + modifiedBySecondThread);
}
public static boolean breakPointCondition(){
breakpointHits++;
if(breakpointHits == 100){
printInfo();
}
return false;
}
private static void printClassLoader() {
print("ClassLoader " + new BreakPointPlay().getClass().getClassLoader());
}
private static void printThread() {
print("Thread " + Thread.currentThread());
}
private static void print(String msg){
System.out.println(msg);
}
}