java - TimerTask 中 ArrayList 的 add() 导致所有元素相同

标签 java arraylist addition timertask

我尝试向 TimerTask 中的 ArrayList 添加一些值。 但在 TimerTask 的下一个实例中,所有先前添加的元素都设置为与当前元素相同。

我做了一个小样本来展示我的问题:

package connection;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;

import controls.PlotValuesContainer;

public class Test
{

    private ArrayList<PlotValuesContainer> m_logData;
    private Timer m_timer;

    public Test()
    {
        m_logData = new ArrayList<PlotValuesContainer>();

        m_timer = new Timer();
        m_timer.scheduleAtFixedRate(new UpdateThread(), 500, 500);
    }

    public static void main(String[] args)
    {
        new Test();
    }

    private class UpdateThread extends TimerTask
    {
        private PlotValuesContainer l_dataContainer = new PlotValuesContainer();

        @Override
        public boolean cancel()
        {
            return super.cancel();
        }

        @Override
        public void run()
        {
            //store time stamp
            l_dataContainer.setTimeStamp(java.time.LocalDateTime.now());

            //store signal values
            final short[] l_Array1to256 = new short[256];
            for (int i = 0; i < l_Array1to256.length; i++)
            {
                l_Array1to256[i] = (short) (Math.random() * Short.MAX_VALUE);
            }
            l_dataContainer.setSignal(l_Array1to256);

            if (m_logData.size() > 0)
            {
                System.out.println("A - oldest: " + m_logData.get(0).getTimeStamp().toString());
            }
            m_logData.add(l_dataContainer);

            System.out.println("B - newest: " + m_logData.get((m_logData.size() - 1)).getTimeStamp().toString());

            for (int i = 0; i < m_logData.size(); i++)
            {
                System.out.println("C - all: " + m_logData.get(i).getTimeStamp().toString());
            }
        }
    }
}

我得到的是:

B - newest: 2019-11-29T08:15:32.882
C - all: 2019-11-29T08:15:32.882
A - oldest: 2019-11-29T08:15:33.335
B - newest: 2019-11-29T08:15:33.335
C - all: 2019-11-29T08:15:33.335
C - all: 2019-11-29T08:15:33.335
A - oldest: 2019-11-29T08:15:33.836
B - newest: 2019-11-29T08:15:33.836
C - all: 2019-11-29T08:15:33.836
C - all: 2019-11-29T08:15:33.836
C - all: 2019-11-29T08:15:33.836
A - oldest: 2019-11-29T08:15:34.335
B - newest: 2019-11-29T08:15:34.335
C - all: 2019-11-29T08:15:34.335
C - all: 2019-11-29T08:15:34.335
C - all: 2019-11-29T08:15:34.335
C - all: 2019-11-29T08:15:34.335
A - oldest: 2019-11-29T08:15:34.836
B - newest: 2019-11-29T08:15:34.836
C - all: 2019-11-29T08:15:34.836
C - all: 2019-11-29T08:15:34.836
C - all: 2019-11-29T08:15:34.836
C - all: 2019-11-29T08:15:34.836
C - all: 2019-11-29T08:15:34.836

我不是一个经验丰富的java程序员...... 有人知道为什么会发生这种情况吗?

非常感谢!

最佳答案

将 l_dataContainer 的实例化移至 run 方法中

private class UpdateThread extends TimerTask
{
    private PlotValuesContainer l_dataContainer;

    @Override
    public boolean cancel()
    {
        return super.cancel();
    }

    @Override
    public void run()
    {
        l_dataContainer = new PlotValuesContainer();
        //store time stamp
        l_dataContainer.setTimeStamp(java.time.LocalDateTime.now());

        //store signal values
        final short[] l_Array1to256 = new short[256];
        for (int i = 0; i < l_Array1to256.length; i++)
        {
            l_Array1to256[i] = (short) (Math.random() * Short.MAX_VALUE);
        }
        l_dataContainer.setSignal(l_Array1to256);

        if (m_logData.size() > 0)
        {
            System.out.println("A - oldest: " + m_logData.get(0).getTimeStamp().toString());
        }
        m_logData.add(l_dataContainer);

        System.out.println("B - newest: " + m_logData.get((m_logData.size() - 1)).getTimeStamp().toString());

        for (int i = 0; i < m_logData.size(); i++)
        {
            System.out.println("C - all: " + m_logData.get(i).getTimeStamp().toString());
        }
    }
}

关于java - TimerTask 中 ArrayList 的 add() 导致所有元素相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100632/

相关文章:

java - 如何检测 JTree 上的选择更改是由键盘还是鼠标进行的?

java - 为什么我会收到 nullPointerException

addition - Emu8086汇编加法器

bash - 在bash脚本中添加两位小数

java - 如何防止 Hibernate 中的重复结果?

java - stormpath() 方法未定义 Spring boot

java - 具有正常关闭功能的 AsynchronousServerSocketChannel

java - ArrayList IndexOutOfBoundsException 在位置 0

java - 初始化 map 、列表等

java - 如何让我的 ArrayList 添加 52 个唯一的对象而不是全部相同?