将增加列表中的所有元素移到另一个列表

时间:2017-11-15 18:34:12

标签: java list synchronization

我有一个同步的ArrayList,通过向列表中添加对象,它可以通过多个线程增加它的大小。我需要以块的形式阅读此列表并继续追加到文件中。我需要一个代码,使用它可以将ArrayList的前几个元素移动到另一个ArrayList,并使用第二个arraylist附加到该文件。应从同步的ArrayList中删除第二个arraylist的所有元素。我需要重复此函数,直到synchronized ArrayList变空。请建议相同的代码。

3 个答案:

答案 0 :(得分:1)

使用阻止队列。

BlockingQueue<String> queue = new ArrayBlockingQueue<>(1000);

按照您现在在列表中的方式从线程添加到队列中。

在一个单独的主题中执行此操作:

while(queue.peek()!=null){
    String s=queue.poll();
    //Write to file
}

答案 1 :(得分:1)

正如@OliverCharlesworth所说,这是一个队列的工作,在java中,由Deque接口处理。

您不需要2个列表。您只需要一个Deque,BlockingLinkedDequeConcurrentLinkedDeque 这将处理线程安全。 Comparison

双端队列有2个侧面可以相应地添加或删除 工作流程就像这样:

worker threads >> deque >> file

工作线程添加到双端队列的开头 文件代码轮询deque的结尾,直到它为空并附加到文件。

// in the workers
dueue.addFirst(aString);


// in the monitor
String current;
while((current = deque.pollLast()) != null){
    // append to File or buffer
}

答案 2 :(得分:0)

我使用了@Novaterata和@Tharun提供的建议,最后使用LinkedBlockingQueue实现了这一点。

LinkedBlockingQueue<CustomObject> sharedList = new LinkedBlockingQueue<>();

// Sharing the queue with multiple threads to write to it.
new ForkJoinPool().submit(() -> logicForAddingDataToQueue(sharedList)).join();

将BlockingQueue中的元素排放到列表中,并将列表附加到文件中,每隔10秒,如下所示:

ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(new Thread(() -> writeToFile(sharedList)){}, 1, 10, TimeUnit.SECONDS);

其中writeToFile方法的定义如下:

public void writeToFile(LinkedBlockingQueue<CustomObject> sharedList) {
      List<CustomObject> subList = new ArrayList<>();
      sharedList.drainTo(subList);
      FileWriterUtil.appendToFile(fileName, subList);
      subList.clear();
}