Я создаю приложение, в котором мне нужно создать общий объект ArrayList. Это многопоточный env, поэтому все потоки должны писать в один и тот же список.
Я пытался создать объект списка и передать его executorservice, но это создало бы несколько копий одного и того же списка, и в конце я вижу только 1 элемент, добавленный в список.
Примечание. Меня интересует только асинхронная запись в список. Мое чтение синхронизировано.
public class main{
public static void main(String[] args)
{
ExecutorService taskExec = Executors.newFixedThreadPool(count);
List<JsonDocument> documents = new ArrayList<JsonDocument>();
// this seems to be incorrect
taskExec.submit(new test(documents, size));
}
}
class test implements Runnable{
// this class will add JsonDocuments to list object
}
Как я могу заставить все потоки использовать / записывать в один и тот же объект списка?
Я новичок в многопоточности, любая помощь будет оценена .
Спасибо.
Обновление: я пытался использовать Collections.syncronizedList, но он все еще не работает для меня .. может быть, я не правильно его использую
public class App {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<JsonDocument> documents = Collections.synchronizedList(new ArrayList<JsonDocument>());
ExecutorService taskExec = Executors.newFixedThreadPool(4);
taskExec.submit(new test(documents, size));
for (JsonDocument json : documents) {
System.out.println(json.toString());
}
while(!taskExec.isTerminated()) {
taskExec.shutdown();
}
}
}
class test implements Runnable {
int size;
List<JsonDocument> doc;
createJson(List<JsonDocument> doc, int size){
this.size = size;
this.doc = doc;
}
public void run() {
Hashtable<String, String> ht = new Hashtable<String, String>();
for (int i=0; i<size; i++) {
ht.put("key"+i, "key"+i);
}
String jsonString = JsonObject.from(ht).toString();
doc.add(new JsonDoc);
}
}
Пожалуйста, поправьте меня здесь.