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

标签 java multithreading

<分区>

好的,所以我有一个监视线程来检查 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 类列表中。

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

最佳答案

如果您的工作代码和非工作代码之间唯一发生变化的是 println 语句,那么您几乎可以肯定存在线程问题。 System.out.println() 语句添加了一个小停顿,这可能会巧合地导致它运行,但并不能解决问题。你可以这样做:

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

...取而代之并检查相同的行为,如果确实相同,那么这几乎可以确认线程问题。然而,正如下面指出的那样,println() 还会做一些其他事情,例如导致内存屏障,因此这不是一个万无一失的测试。另一个可能更好的检查方法是暂时将 ArrayList 换成 Vector,这是线程安全的 - 虽然这是一个遗留集合,因此不建议在最终代码中使用。

如果是这种情况,听起来您没有正确同步 ArrayList 调用 - ArrayList 不是线程安全集合。每当您读取或写入列表时,都在同步块(synchronized block)内执行,就像这样,在列表上同步:

synchronized(list) {
    list.whatever();
}

...这将确保一次只有一个线程可以访问ArrayList,有望解决线程问题。

关于java - 除非打印出来,否则值不会在 while 循环中更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16838874/

相关文章:

java - 我如何减少 SQLite 表的 int 列

java - 为什么 totalpay 加起来不正确?

c - 父子进程打印

java - 在java中生成几个随机双数

java - 无法删除 JLabel (Netbeans)

objective-c - 如何在 Objective-C 中等待线程完成

java - 不确定我的 10 个线程在启动时是否正在读取相同的 .txt 文件

multithreading - std::this_thread::yield()用法?

java - 通过 jsoup 从表(html)中获取除 div 标签之外的数据

Java 多线程 - 将数据结构传递给线程