【问题标题】:Java (Android) threads , accessing same listJava (Android) 线程,访问同一个列表
【发布时间】:2011-05-11 10:19:24
【问题描述】:

我是 Java 和 Android 的新手,所以请耐心等待。

我在主 UI 上填充了一个字符串数组列表。

我有另一个线程通过套接字一个接一个地发送 arrayList 的字符串,并在发送每个字符串后将其从列表中删除。

所以基本上它是一个 FIFO ,两个不同的线程访问同一个 arrayList。

如何在同一个列表上进行读写操作,线程安全?因为我读了我必须这样做,从而防止将来出现错误。

我的第一个想法是创建一个同步方法来访问 arrayList。

这是我创建的用于两个线程访问 ArrayList 的方法。

public synchronized String accessArrayList(boolean add, boolean get, String utt)
{
    if(add){            
        mStrings.add(utt);
        return null;
    }
    else if(get){
        return mStrings.get(0);

    }
    else{
        mStringsUttComm.remove(0);
        return null;
    }


}

主线程只是将字符串添加到这个列表中。

第二个线程这样做:

Runnable runner = new Runnable() {
      public void run() {
          while(!mString.isEmpty()){
                              //socket sends string               
              sc.actionPerformed(accessArrayList(false, true, null));
                              //erase from list
              accessArrayList(false, false, null);
          }

      }
};

这是正确的吗?因为我是 eclipse 的新手,如果另一个线程正在使用它,我找不到一种方法来确认一个线程不会调用 accessArrayList。

感谢您的宝贵时间。

【问题讨论】:

    标签: java android multithreading thread-safety synchronized


    【解决方案1】:

    【讨论】:

    • +1 ya @cornelyus 在线程中使用时使用向量,对于普通方法使用arraylist。
    • 谢谢.. 不知道Vector类,会看看。再次测试我所做的,它似乎工作.. 使用 Vector 就不需要创建我所做的同步方法,对吗?
    • 向量是同步的,所以无论你对它的内容做什么都是正确的,同步会为你处理。
    • CopyOnWriteArrayList 是线程安全的,但不能保证返回的结果是最新的。这是一个需要考虑的重要因素,但可能不会打扰您,具体取决于列表的用途。
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多