我有一个ArrayList对象:避免ArrayList的并发多线程
List<Sample> dataList = new ArrayList<Sample>();
这有样品对象的列表。示例包含一个很长的时间戳和一个双值基元。
我有一个程序,将通过多线程作用于这些。我有一个线程将修剪数据1 /小时。修剪需要大约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();
}
}
在至今运行此,我已经没有任何并发例外,我不认为我有任何丢失数据。如果pruner使Add函数等待它,我担心丢失的数据。任何人都可以解释为什么我没有例外吗?我应该以不同的方式做这件事吗?
它看起来像你真的只用这个队列。有很多正确的并发队列结构。 –
嘿路易斯,这是一个趋势应用程序的一部分。数组列表中的数据可以在某些情况下进行扩展,并锁定在修剪器必须等待24小时才能再次触摸它的位置。 – Tacitus86
是的,那又如何? –