当前位置: 首页 > 面试题库 >

除非打印出来,否则值不会在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
    }
}

编辑: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()还会做其他一些事情,例如引起内存障碍,因此这不是万无一失的测试。另一个也许更好的检查方法是暂时替换ArrayListVector,这是线程安全的-
尽管这是一个旧式集合,所以不建议在最终代码中使用。

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

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

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



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

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

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

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

  • //在下面的程序中,在内部,当用户收到指令时,他可以简单地进入哨兵退出while循环,但是,当您得到希望购买的票的结果时,按999并不退出程序

  • 在下面的代码中,我试图提示用户输入一个数字,如果它小于1,则要求输入另一个正数。 在输入正数之前,它似乎一直在工作,但在给出正数后,程序将打印最终的错误消息。 输入正数后,如何阻止打印此错误消息?