Потоки Java (Android), обращающиеся к тому же списку

Я новичок в Java и Android, так что терпите меня.

У меня есть один массив строк, который я заполняю в основном пользовательском интерфейсе.

У меня есть другой поток, который отправляет одну за другой строки массиваList через сокет, и после отправки каждой он стирает ее из списка.

Так что в основном это 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, если его использует другой.

Спасибо за уделенное время.


person cornelyus    schedule 11.05.2011    source источник


Ответы (1)


Взгляните на векторы и синхронизацию:

Векторы: http://download.oracle.com/javase/1.4.2/docs/api/java/util/Vector.html

Синхронизация: http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html

person Yahel    schedule 11.05.2011
comment
+1 ya @cornelus использует вектор при использовании в потоке, а для обычного метода используйте arraylist. - person Ganapathy C; 11.05.2011
comment
Спасибо .. Не знал о классе Vector, посмотрю. Снова проверил то, что я сделал, и, кажется, работает. С Vector не было бы необходимости создавать синхронизированный метод, который я сделал, верно? - person cornelyus; 11.05.2011
comment
Векторы синхронизируются, поэтому вы правы, что бы вы ни делали с их содержимым, синхронизация позаботится о вас. - person Yahel; 12.05.2011
comment
CopyOnWriteArrayList является потокобезопасным, но вы не гарантируете, что возвращаемый вами результат будет актуальным. Это важный фактор, который следует учитывать, но он может не беспокоить вас в зависимости от того, для чего предназначен этот список. - person Yahel; 12.05.2011
comment
Пожалуйста, не забудьте отметить этот вопрос как ответ, если он вам помог. - person Yahel; 12.05.2011
comment
Теперь у меня есть CopyOnWriteArrayList, и с использованием синхронизированного метода accessArrayList, который у меня уже был.. может быть, это излишне, потому что у меня будет только 2 потока, обращающихся к одному и тому же списку, один из них только добавляет к нему элемент.. использования только CopyOnWriteArrayList должно быть достаточно, но как Не уверен, оставлю как есть. - person cornelyus; 20.05.2011