2015-01-05 11 views
30

इंटेलिजे आईडीईए 14.0.2 में एकाधिक धागे और ब्रेकपॉइंट्स के साथ मुझे एक अजीब समस्या है। ब्रेकपॉइंट के बाद कोड इसे बंद होने से पहले निष्पादित किया जाता है।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"); 
     } 
    } 
} 

जब मैं लाइन 12, synchronized (this.lock) पर एक ब्रेकपाइंट (को निलंबित सभी) रखा, System.out.println अभी भी (कभी कभी कई बार) निष्पादित करता है।

enter image description here

जहाँ तक मुझे पता है, सभी धागे ब्रेकप्वाइंट पर बंद कर देना चाहिए: यहाँ एक स्क्रीनशॉट है।

+0

जो लाइन 12 है? –

+2

क्या होगा यदि आप लाइन 14 पर ब्रेकपॉइंट डालते हैं? (println) – Raffaele

+1

मैं आपको आश्वस्त कर सकता हूं कि * धागे का एक * बंद हो गया है ... कौन सा अनिश्चित है। – Makoto

उत्तर

72

प्रलेखन भ्रमित रूप से पढ़ता है, लेकिन this is the relevant block. यह क्या करता है कि यह थ्रेड पर निलंबित करने के लिए संपत्ति को सेट कर रहा है, न कि पूरे एप्लिकेशन को। यह आपको मनमाने ढंग से, अनिश्चित धागे के बजाय प्रत्येक व्यक्तिगत धागे पर ब्रेक पॉइंट हिट करने का कारण बनता है।

Suspend box checked with Thread radio button selected.

  • को निलंबित नीति: सभी
    • जब एक ब्रेकपाइंट मारा जाता है, सभी धागे को निलंबित कर दिया गया है।
  • नीति को निलंबित: थ्रेड
    • जब ब्रेकप्वाइंट मारा जाता है, धागा जहां ब्रेकप्वाइंट मारा जाता है निलंबित कर दिया है।
+1

वास्तव में जब कोई ब्रेकपॉइंट हिट करता है तो मैं सभी धागे को निलंबित करना चाहता हूं। ग्रहण की तरह ही। मुझे लगता है कि यह संभव नहीं है? – m0skit0

+8

वास्तव में दस्तावेज़ीकरण कहता है: "सब - जब ब्रेकपॉइंट मारा जाता है, तो सभी धागे निलंबित कर दिए जाते हैं"। यह वही व्यवहार है जो मैं चाहता हूं। समस्या कुछ धागे हैं, कभी-कभी, ब्रेकपॉइंट हिट होने के बाद निष्पादन पर रहते हैं, शायद जब आईडीईए ब्रेकपॉइंट को हिट करने के लिए पहले धागे को रोक रहा है। मुझे लगता है कि यह आईडीईए डीबगर, या जेवीएम पर बस एक बग है। उन्हें कम से कम दस्तावेज पर व्यवहार को स्पष्ट करना चाहिए, क्योंकि यह केवल गलत है, भ्रमित नहीं है। – m0skit0

+0

वैसे भी आपका समाधान मेरे लिए मेरे लिए काम करता है, बहुत बहुत धन्यवाद। – m0skit0

संबंधित मुद्दे