2010-02-24 34 views
0

我正在使用Java中的多線程程序,它使用共享數組在線程之間傳遞數據。它正在Netbeans 6.7.1中開發。Java程序僅適用於Netbeans中的斷點

其中一個線程似乎只有在放置斷點時才起作用,它並不重要。

在沒有斷點的調試模式下運行的行爲與在發行版中運行相同 - 預期的輸出永遠不會到達。

我不知道問題出在哪裏,因爲添加斷點的時刻,我按下繼續,它按預期工作。

如何縮小發生此問題的位置/原因?

示例代碼:

result = utils.isBufferFull(AudioDuplex.voiceArray); 
if(result == true) { 
    System.out.println("Taking copy"); 

    voiceArray = AudioDuplex.voiceArray;//.clone(); 
    utils.clearBuffer(AudioDuplex.voiceArray); 

} 

如果一個斷點被放置在第2行,它永遠不會擊中。 第3行中的斷點將被擊中,預期的輸出將到達。

+0

它被稱爲競爭條件 - 兩個線程正在以這樣一種方式進行交互,即只有當你放慢其中一個時,它纔會做你想要的。 – 2010-02-24 13:45:54

+0

你使用什麼機制來同步對共享數組的訪問?您使用什麼機制將共享數據的更改通知給那些對這些更改感興趣的線程? – VoidPointer 2010-02-24 13:46:36

+0

只是對代碼的評論......你不需要if語句中的「== true」。只是做「如果(結果){」 – Ascalonian 2010-02-24 14:24:51

回答

1

如果沒有更長的代碼示例,不可能準確地判斷出什麼是錯的,但根據我的經驗,這種行爲是典型的未識別的生產者 - 消費者問題(請參閱http://en.wikipedia.org/wiki/Producer-consumer_problem)。

基本上,可能發生的情況是您的生產者線程在消費者線程請求它時沒有可用的數據。基本的解決方案是保持一個信號量(java afaik中有一個Sempahore類)。生產者會在有數據時發佈信息,消費者會等到生產者發佈信息。

你所看到的與斷點是你停止消費者線程足夠長的時間,生產者可以提供一些東西。當你沒有中斷時,消費者正常運行,並在生產者有任何事情之前退出。

+0

經過幾次重新運行後,斷點問題消失了,並且在有問題的線程檢查陣列修復問題之前添加了10ms的睡眠時間。謝謝你的建議! – dig412 2010-02-24 14:52:27

+0

這並不「解決」問題,它只是使其消失。您必須正確地同步這兩個線程,否則它將在加載時再次中斷。 – 2010-02-24 14:57:39

1

將相關變量的值寫入日誌文件,控制檯或將其添加到數組中,並在出現錯誤時立即將其打印出來。

您的問題可能是運行時問題(第二個線程更新涉及的變量)。由於斷點只會停止活動線程,因此第二個線程將完成其工作,以便代碼正常工作。

+0

我試過使用sleep()暫停它,但它不起作用。最令人困惑的問題是奇怪的斷點行爲,我在問題中添加了一個代碼示例。 – dig412 2010-02-24 13:53:39

+0

哪個版本的Java? – 2010-02-24 14:39:08

相關問題