我正在使用Java中的多线程程序,该程序使用共享数组在线程之间传递数据。它是在Netbeans 6.7.1中开发的。
其中一个线程似乎只在其中放置断点时起作用,无论它在何处都无关紧要。
在没有断点的调试模式下运行与在发布中运行相同 - 预期的输出永远不会到达。
我无法分辨问题出在哪里,因为添加断点的那一刻我按下继续,它按预期工作。
如何缩小此问题发生的位置/原因?
示例代码:
result = utils.isBufferFull(AudioDuplex.voiceArray);
if(result == true) {
System.out.println("Taking copy");
voiceArray = AudioDuplex.voiceArray;//.clone();
utils.clearBuffer(AudioDuplex.voiceArray);
}
如果断点放在第2行,则永远不会被击中。 第3行的断点将被击中,预期的输出将到达。
答案 0 :(得分:1)
将所涉及变量的值写入日志文件,控制台或将它们添加到数组中,并在出现错误时立即打印它们。
您的问题可能是运行时问题(第二个线程更新涉及的变量)。由于断点仅停止活动线程,因此第二个线程完成其工作以使代码正常工作。
答案 1 :(得分:1)
如果没有更长的代码示例,就不可能确切地说出错误是什么,但根据我的经验,这种行为是典型的无法识别的生产者 - 消费者问题(参见http://en.wikipedia.org/wiki/Producer-consumer_problem)。
基本上,可能发生的事情是,当消费者线程请求时,您的生产者线程没有可用的数据。基本的解决方案是保持一个信号量(在java afaik中有一个Sempahore类)。生产者会在有数据时发布,消费者会等到生产者发布。
你看到的断点是你停止消费者线程足够长的时间,生产者可以提供一些东西。当你没有休息时,消费者会正常运行,并在生产者有任何东西之前退出。