2010-11-14 2 views
1

У меня есть переменная, объявленная как:Java нить архитектура и дизайн приложения

private static List<String> _search_result_list = new ArrayList<String>(15); 

В этом приложении есть ряд потоков, которые подключаются к различным серверам и получить данные из URL-адресов, поставляемых на резьбу. Темы получают результаты URL-адресов, конвертируют их в текст и сохраняют их в _search_result_list. Мои вопросы касаются синхронизации доступа к потоку _search_result_list. Каков наилучший способ сделать это?

Кроме того, потоки не создаются в том же классе, что и _search_result_list, и на самом деле не имеют доступа к охватываемому классу _search_result_list. Достаточно ли передать указатель _search_result_list классу, который создает потоки, а затем снабжать этот поток каждым потоком указателем на _search_result_list. Будет ли это требовать синхронизации, или даже имеет значение, если потоки пытаются одновременно записывать в ArrayList?

Любой ввод оценивается.

Марс

ответ

2

Проще всего использовать синхронизированный список:

  1. Оберните ваш список в Collections.synchronizedList(list)

    private static List<String> _search_result_list = 
         Collections.synchronizedList(new ArrayList<String>(15)); 
    
  2. Если у вас есть еще много читает, чем записи, чем использование CopyOnWriteArrayList.

0
public void addData(String data) { 
    synchronized(_search_result_list) { 
     _search_result_list.add(data); 
    } 
} 
+0

Я думаю, что этот метод тоже будет работать. – Mars