Содержимое массива Java изменяется самостоятельно
У меня есть программа, которая запрашивает значения из RTI DDS на основе списка точек (DynamicIoRunnable ниже). DyamicIoRunnable будет запрашивать экземпляр данных для каждой точки в предварительно определенном списке, он будет помещать данные в список и, как только он пройдет через все элементы в предварительно определенном списке, передаст их в поток процессора (ниже DDSP-обработчик - это сокращено до соответствующая часть) через общий BlockingQueue. Этот процессорный поток обработает каждый элемент в списке и создаст для него пользовательский объект (PointData). Чтобы устранить эту проблему, DynamicIoRunnable имеет только одну предопределенную точку, поэтому я легко могу ее идентифицировать. Проблема в том, что я добавляю PointData в список и распечатываю его по мере его сборки. Оператор печати перед добавлением всегда показывает правильное значение, но поскольку я перебираю массив с операторами печати после каждого добавления, после нескольких элементов предыдущие элементы меняются на другие данные, и я не уверен, как. Кто-нибудь видит, где что-то может быть изменено?
У меня есть пример результатов ниже. Это показывает первое повреждение после нескольких циклов (первые 2 элемента, которые были первоначально добавлены в список, полностью изменяются - это ухудшается по сравнению с несколькими дополнительными элементами и всегда является более старыми элементами, хотя я не вижу единой закономерности относительно того, что изменяют данные чтобы, когда это изменится или сколько изменится).
Общая очередь
public static BlockingQueue<Object> messageProcQueue = new LinkedBlockingQueue<Object>();
DynamicIoRunnable
public void run()
{
try
{
List<PointData> temp = new ArrayList();
for (PredefData a : TrendApp.predefPointList)
{
if (a.getDdsHandle() != null)
{
Object ioData = dds.getTopicRef().get(pv.getTypeString(a.getPointType().value())).read_io(a.getDdsHandle(), io -> io);
if (ioData != null)
{
PointData val = new PointData(a.getMachineId(), a.getPointType(), a.getIoId(), a.getSubfield(), a.getConfigId(), ioData);
temp.add(val);
}
}
}
TrendApp.messageProcQueue.put(temp);
} catch (Exception e)
{
errorLog.error("Unable to add dynamic IO to message processing queue");
e.printStackTrace();
}
}
DDSProcessor
private static List<PointData> writeBuffer = new ArrayList<PointData>();
if (a instanceof PointData)
{
PointData req = (PointData) a;
// Add new point to the buffer
System.out.println("Enter Point Data: " + req.getData());
writeBuffer.add(req);
for (int x = 0; x < writeBuffer.size(); x++)
{
System.out.println("Building Buffer = " + writeBuffer.get(x).getData());
}
}
PointData Object
private int machineId;
private jPointType pointType;
private int ioId;
private String subfield;
private int configId;
private long timestamp;
private Object data;
public PointData(int machineId, jPointType pointType, int ioId, String subfield, int configId, Object data)
{
this.machineId = machineId;
this.ioId = ioId;
this.pointType = pointType;
this.subfield = subfield;
this.configId = configId;
this.data = data;
}
Пример результатов
Add Point Data to list:
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 974.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Add Point Data to list: :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 224
value: 0.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0
Building Buffer = :
machineId: 1186
ioId: 31
value: 956.0