2013-03-08 27 views
7

ben şöyle kırılma noktaları ile aşağıdaki kodu çalıştırmak çalışıyorum iş parçacıklı kodundaki tüm kesme noktaları üzerinde durmuyor: Ben kaldırırsanız ...intellij -

new Thread(new Runnable() { 
     @Override 
     public void run() { 
      System.out.println("Starting"); //breakpoint here 
     } 
    }).start(); 

    int i = 10; 
    i++; //breakpoint here 

Bu kod SADECE i çalıştırdığında ++ kesme noktası isabet Bu, diğer iş parçacığının kesme noktası doğru bir şekilde vurulacaktı. Bu garip davranış neden ortaya çıkıyor?

cevap

6

Bu http://www.jetbrains.com/idea/webhelp/breakpoints-2.html belgelenmiştir: IntelliJ IDEA bir kesme noktasında durmayacak zaman

belli durumlar vardır. Aşağıdaki durumu göz önünde bulundurun: Bir sınıfın farklı yöntemlerinde iki kesme noktası belirlenir ve burada askıya alma politikası Tümü olarak ayarlanır. Kesme noktalarından biri vurulduğunda, bazı adım eylemleri gerçekleştirilir. Eğer başka bir iplik atma sırasında ikinci kesme noktasına ulaşırsa, IntelliJ IDEA orada durmayacaktır.

Ben senin kod örneği kopyalanan ve durumu yeniden yarattı. i++ kesme noktasında durduktan sonra, belgede belirtildiği gibi, F8'e basarsam (adım üstü) program diğer kesme noktasında durmaz. Ancak F9'a basarsam (devam) programında diğer kesme noktasında tekrar durur.

+0

Şahsen bunun bir yarış durumu olduğuna inanıyorum. Benim durumumda * özgeçmiş * hala yeni iş parçacığı üzerindeki kesme noktasını tetiklemiyor ** değil. Düzeltmenin tek yolu, yeni bir iş parçacığı başlatmadan hemen önce kırılmamanızdır. Sonra her şey çalışıyor. – kervin

+0

Kesme noktalarınızdaki askıya alma politikası 'Hepsi' olarak ayarlanmış mı ('Thread' yerine)? –

+0

Evet hepsi. Sorunu sadece iş parçacığı başlangıcından daha yakın/daha fazla hareket ettirerek tetikleyebilirim, böylece tek başına bir tür yarış durumunu onaylar. – kervin

0

Diğer iş parçacığı arka planda çalışacak şekilde planlanan olduğundan ve işletim sistemi iş parçacığı zamanlayıcı bunu çalıştırmaya karar verdiğinde, çalışır. İçinde bir kırılma noktası olduğunda, vurulacak.

kişiyi ne zaman kodu ile çalıştırdığınızda mutlaka başlamamış olacak, bu yüzden i++ kırılma noktalarının hemen vuruldu.

+0

Kesme noktası ASLA vuruldu ...Ana iş parçacığı yürütmeyi bitirir, yazdırılan "Başlangıç" dizesini görebiliyorum, böylece satır yürütüldü, ancak hiçbir kesme noktası – Bober02

+0

@ Bober02'ye çarptı. Belki de hata ayıklayıcınız çok iş parçacıklı hata ayıklama yapmaz? –

0

Sadece bu sorun vardı ve bu çalıştırmak başkaları uğruna, burada bu davranış ve nasıl bunu değiştirmek için nedenidir. Doron'un belirttiği gibi, bununla ilgili bir dokümantasyon bulunmaktadır. Ancak, dikkat edilmesi gereken şey, varsayılan olarak, bir kesme noktasına ulaşıldığında JVM'deki tüm parçacıkların askıya alındığıdır. Eğer bekliyor (ve ne bekliyordum) breakpoint'de sadece iplik askıya olmasıdır Ne

.

Bu

istediğini değil, ne istediğim kadar.

Bu davranışı değiştirmek için (ve istenen davranışı sağlayın).

1) marjı sol tıklama ile bir kesme noktası oluşturun.
2) ctrl + shift + F8 tuşlarına basın (kesme noktası menüsünü açmak için).
3) Kesme noktanızı seçin. Bunun için seçenekleri göreceksiniz.
4) "Suspend" un işaretlendiğinden ve "Thread" radyo seçeneğinin seçildiğinden emin olun.
5) "Varsayılan yap" düğmesine tıklayın.

Şimdi, koştuğunuzda, farklı iş parçacıklarındaki kesme noktalarının vurulduğunu göreceksiniz.