微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

除非打印出来,否则值不会在while循环中更新

如何解决除非打印出来,否则值不会在while循环中更新

如果在工作代码和非工作代码之间唯一改变的是println语句,那么几乎可以肯定会有线程问题。该System.out.println()语句增加一个小暂停,这可能会偶然导致它的行为,但不能解决问题。您可以执行以下操作:

try {
    Thread.sleep(10);
} catch (InterruptedException ex) {
}

…代替它并检查相同的行为,如果确实相同,那么这几乎可以确认线程问题。但是,正如下面所指出的,它println()还会做其他一些事情,例如引起内存障碍,因此这不是万无一失的测试。另一个也许更好的检查方法是暂时替换ArrayListVector,这是线程安全的- 尽管这是一个旧式集合,所以不建议在最终代码中使用。

如果是这种情况,听起来您没有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类中的列表中。

有什么帮助吗?当我尝试在控制台中调试时,让它吐出数字确实很烦人。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。