当前位置: 首页 > 知识库问答 >
问题:

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

李洋
2023-03-14

好的,所以我有一个监视线程,它检查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
    }
}

EDIT: getSize()代码:

public ArrayList<byte[]> myQueue = new ArrayList<byte[]>();

public int getSize() {
    return myQueue.size();      
}

注意:我正在运行另一个线程,该线程正在更新并添加到我的 t 类中的列表中。

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

共有3个答案

庞瀚
2023-03-14

你的读者正在饿死作者,所以它永远没有机会运行,永远不会在你的列表中添加任何东西。

通过添加 I/O 调用(系统.out.print 或 线程睡眠),您可以将读取器线程置于阻塞状态,从而允许其他线程运行。

通常,像这样消耗100% CPU的循环是不好的。至少在循环中的某个地方添加一个短睡眠/产出。

孙泉
2023-03-14

ArrayList未同步,或者未准备好同时在两个线程中使用。在JLS术语中,在一个线程中添加元素与另一个线程的size()调用之间没有任何关系。

最简洁的解决方案是使用同步列表实现。您可以使用Vector,也可以使用Collections.synchronizedList()在ArrayList周围创建一个同步包装器。

锺离德运
2023-03-14

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

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

...取而代之的是检查相同的行为,如果确实是相同的,那么这就相当于确认了线程问题。然而,正如下面指出的那样,< code>println()还会做一些其他的事情,比如造成内存障碍,所以这不是一个万无一失的测试。另一个可能更好的检查是暂时用< code>Vector替换< code>ArrayList,这是线程安全的——尽管这是一个遗留集合,所以不建议在最终代码中使用。

如果是这种情况,听起来您没有正确同步数组列表调用 - 数组列表不是线程安全的集合。每当您读取或写入列表时,请在同步块内执行此操作,如下所示,在列表上同步:

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

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

 类似资料:
  • 问题内容: 好的,所以我有一个监视线程,该线程检查ArrayList的大小,并在该大小大于某个数字之后执行一些操作。我现在遇到的问题是,除非我的循环中有打印语句,否则大小值永远不会更新。这是一些代码来显示我到底要做什么。 上面的代码不起作用。它永远不会进入if语句。但是,这很好用: 编辑:getSize()代码: 注意:我有另一个正在运行的线程正在更新并添加到我的t类中的列表中。 有什么帮助吗?当

  • 大家好,我被一个问题困住了,想不出解决办法。我使用的是while循环,do while循环和for。我知道我的前两个while循环是正确的,我试图完成的是让我的do while循环和for语句打印出与我的第二个while循环相同的东西。 输入要打印的消息? 你好 输入要打印邮件的次数。输入1-20之间的值: 5 使用do-while循环输出... 第6.0行-你好 do-while循环中的时间..

  • 我有以下代码 在上面的 java 方法中, 变量跟踪从网络下载文件的时间,并在文件下载完成时变为 ;以便在文件下载完成时返回函数。 我面临的奇怪问题是,如果我删除上面的行(只有一个println的行);该方法卡在while循环中,即使文件已经下载,也不会返回!知道为什么会这样吗? 编辑:这不是在单独的线程中运行。另一个类()中的文件下载代码在单独的中运行。同样,fileCheck的getter也在

  • 这是我的代码: 我的问题是如何检查分数是否在范围内,如果输入了错误的输入,如何使循环重复。当我试图运行程序并输入一个超过范围的输入时,它会转到下一个评估数字,而不是再次尝试,直到它是真的。

  • 我只想用下面的公式从任何给定的数字创建一个因子列表。我不允许使用列表,因此,我模仿使用字符串如下: 例如,假设我们选择num=12:

  • 我创建了一个while循环来为我的程序创建菜单,它将一直循环,直到用户在控制台中键入“退出”。我的问题是,每当我在控制台中输入'Transfer'时,if语句都能正常运行,但当它返回到循环的开始时,