我有一個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
是的,那又如何? –