2015-01-05 21 views
30

Tôi gặp sự cố lạ với nhiều chuỗi và điểm ngắt trong IntelliJ IDEA 14.0.2. Mã sau khi breakpoint được thực hiện trước khi nó dừng lại trên nó.Làm thế nào để gỡ lỗi một ứng dụng đa luồng trong IntelliJ?

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"); 
     } 
    } 
} 

Khi tôi đặt một breakpoint (Suspend Tất cả) tại dòng 12, synchronized (this.lock), System.out.println vẫn thực thi (đôi khi nhiều lần). Dưới đây là một ảnh chụp màn hình:

enter image description here

Theo như tôi biết, tất cả các chủ đề nên dừng lại ở breakpoint.

+0

là dòng 12? –

+2

Nếu bạn đặt điểm ngắt tại dòng 14 thì sao? (println) – Raffaele

+1

Tôi có thể đảm bảo với bạn rằng * một * trong số các chủ đề đã dừng ... mà một trong những chưa được xác định. – Makoto

Trả lời

72

Tài liệu đọc gây nhầm lẫn, nhưng this is the relevant block. Những gì nó chưng cất xuống là đặt thuộc tính để tạm dừng trên chuỗi chứ không phải toàn bộ ứng dụng. Điều này sẽ khiến bạn nhấn điểm ngắt trên mỗi chuỗi riêng lẻ thay vì một chuỗi không xác định, không xác định.

Suspend box checked with Thread radio button selected.

  • Đình chỉ Policy: Tất cả
    • Khi một breakpoint là hit, tất cả các chủ đề được treo.
  • Suspend chính sách: Chủ đề
    • Khi breakpoint là hit, thread nơi breakpoint là hit bị đình chỉ.
+1

Trong thực tế, tôi muốn đình chỉ tất cả các chủ đề khi bất kỳ lượt truy cập breakpoint. Cũng giống như Eclipse. Tôi đoán điều đó là không thể? – m0skit0

+8

Trong tài liệu thực tế nói: "Tất cả - Khi một điểm ngắt được nhấn, tất cả các chủ đề bị đình chỉ". Đây chính là hành vi tôi muốn. Vấn đề là một số chủ đề, đôi khi, tiếp tục thực hiện sau khi breakpoint là hit, có thể khi IDEA dừng thread đầu tiên để đạt breakpoint. Tôi nghĩ rằng đây chỉ đơn giản là một lỗi trên trình sửa lỗi IDEA, hoặc JVM. Họ nên ít nhất làm rõ hành vi trên tài liệu, bởi vì nó chỉ đơn giản là sai, không gây nhầm lẫn. – m0skit0

+0

Dù sao thì giải pháp của bạn vẫn hoạt động tốt cho tôi, cảm ơn bạn rất nhiều. – m0skit0

Các vấn đề liên quan