【发布时间】:2017-10-05 19:09:12
【问题描述】:
我有一个 ArrayList 对象:
List<Sample> dataList = new ArrayList<Sample>();
这有一个 Sample 对象的列表。示例包含一个长时间戳和一个双值原语。
我有一个程序可以通过多个线程对这些进行操作。我有一个线程将修剪数据 1/hr。修剪大约需要 2 分钟才能完成(低端嵌入式系统和大量数据)。它调用以下函数来执行此操作:
public synchronized void prune(long timestamp)
{
Iterator<Sample> it = dataList.listIterator();
while (it.next().getTimestamp() < timestamp)
{
it.remove();
}
}
}
我还通过另一个线程以 1/秒的速度将动态数据更新到该数组。根据添加的数据,它可以调用以下两个函数之一:
public synchronized void addPointData(ArrayList<Sample> a)
{
a.addAll(dataList);
dataList = a;
}
public synchronized void addPointData(Sample a)
{
dataList.add(a);
if (dataList.size() > 0 && pruneLock == 0 && dataList.get(0).getTimestamp() < (System.currentTimeMillis() - 90000000L) * 1000000)
{
dataList.remove(0);
startTimestamp = dataList.get(0).getTimestamp();
}
}
到目前为止,我没有遇到任何并发异常,我不相信我有任何丢失的数据。如果修剪器让添加功能等待它,我担心会丢失数据。谁能解释为什么我没有例外?我应该以不同的方式来做这件事吗?
【问题讨论】:
-
看起来您实际上只是将其用作队列。有很多正确的并发队列结构。
-
嘿路易斯,这是趋势应用程序的一部分。数组列表中的数据可以在某些情况下扩展并锁定,修剪器必须等待 24 小时才能再次触摸它。
-
是的,然后呢?
-
还有内存限制(在内存存储中),使用数组列表到底有什么问题。为什么我要使用队列?
-
你这里的方法都没有做到这一点。如果情况确实如此,则可能需要使用列表,但我会注意到
remove(0)来自ArrayList会非常昂贵,因为它是 O(n)。
标签: java multithreading arraylist