问题描述
如果在工作代码和非工作代码之间唯一改变的是println语句,那么几乎可以肯定会有线程问题。该System.out.println()
语句增加了一个小暂停,这可能会偶然导致它的行为,但不能解决问题。您可以执行以下操作:
try {
Thread.sleep(10);
} catch (InterruptedException ex) {
}
…代替它并检查相同的行为,如果确实相同,那么这几乎可以确认线程问题。但是,正如下面所指出的,它println()
还会做其他一些事情,例如引起内存障碍,因此这不是万无一失的测试。另一个也许更好的检查方法是暂时替换ArrayList
为Vector
,这是线程安全的-
尽管这是一个旧式集合,所以不建议在最终代码中使用。
如果是这种情况,听起来您没有ArrayList
正确同步调用-ArrayList
不是线程安全集合。每当您读取或写入列表时,都应在同步块内进行操作,如下所示,在列表上进行同步:
synchronized(list) {
list.whatever();
}
…这将确保只有一个线程可以ArrayList
一次访问该线程,从而有望解决线程问题。
解决方法
好的,所以我有一个监视线程,该线程检查ArrayList的大小,并在该大小大于某个数字之后执行一些操作。我现在遇到的问题是,除非我的循环中有打印语句,否则大小值永远不会更新。这是一些代码来显示我到底要做什么。
while(working) {
// Get size function just returns the size of my list in my t class
int size = t.getSize();
if (size >= 10) {
//DO STUFF
}
}
上面的代码不起作用。它永远不会进入if语句。但是,这很好用:
while(working) {
// Get size function just returns the size of my list in my t class
int size = t.getSize();
System.out.println(size);
if (size >= 10) {
//DO STUFF
}
}
编辑:getSize()代码:
public ArrayList<byte[]> myQueue = new ArrayList<byte[]>();
public int getSize() {
return myQueue.size();
}
注意:我有另一个正在运行的线程正在更新并添加到我的t类中的列表中。
有什么帮助吗?当我尝试在控制台中调试时,让它吐出数字确实很烦人。