【问题标题】:For loop isn't working well inside a threadFor 循环在线程内无法正常工作
【发布时间】:2013-08-17 03:33:24
【问题描述】:

EDIT2:这是代码和输出:

private void myFunc()
{
    itemsIdsArray = new boolean[3];
    for(int i = 0;i<itemsIdsArray.length;i++){
        itemsIdsArray[i] = true;
    }

    for(int i = 0;i<itemsIdsArray.length;i++){
        if(itemsIdsArray[i]){
            Log.d(Global.TAG,"first in i: " + i);
        }
    }

    Thread timer = new Thread(){
        public void run(){
            try{
                for(int i = 0;i<itemsIdsArray.length;i++){
                    if(itemsIdsArray[i]){
                        Log.d(Global.TAG,"second in i: " + i);
                    }
                }
            }finally{

            }
        }
    };
    timer.start();
}

输出:

08-15 03:27:38.136: D/MyTag(22229): first in i: 0
08-15 03:27:38.136: D/MyTag(22229): first in i: 1
08-15 03:27:38.136: D/MyTag(22229): first in i: 2

我的问题:为什么第二个循环 i 没有打印出来。?

【问题讨论】:

  • itemsIdsArray 是如何初始化的?
  • 我想你必须提供一个SSCCE
  • 您需要向我们展示更多代码。据我们所知,您只需将itemsIdsArray 的每个元素都设置为false,这正是它应该做的。
  • itemsIdsArray 只是一个字段,该数组的单元格是动态填充的,代码很多,我不认为我应该发布它。我正在 1 分钟内编辑原始帖子。
  • @idish 不发布所有内容,只发布与itemsIdsArrayinitialization 相关的内容,以及将发生这种情况的方法与timer@987654329 所在的方法相关联的任何内容@ 被初始化并运行。您的编辑是您首先发布的代码的副本。这不会有帮助。

标签: java android arrays multithreading boolean


【解决方案1】:

如果myFunc() 被调用了两次,或者在线程完成之前有任何其他东西正在修改itemsIdsArray 中的值,那么这会影响线程看到的内容。

如果您希望效果类似于线程启动时的值的“快照”,请在创建线程之前复制相关数组,并将本地副本传递给线程。

【讨论】:

  • 非常感谢您的解决方案,您完全正确,我没有想到在后台线程执行时,前台线程重新初始化了数组。我设法修复它,它现在工作得很好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
相关资源
最近更新 更多