将arraylist项目连接到线程和其他方式的最佳方法

时间:2015-06-20 21:57:08

标签: java android multithreading arraylist

我正在开发一款包含对象ArrayList的Android应用。 Arraylist中的每个对象代表我的应用程序所连接的蓝牙设备。

对于Arraylist中的每个设备,正在运行一个执行蓝牙通信的线程。 (我打算将这些线程也放在一个数组中)。

我正在努力的是:将Arraylist-item连接到线程的最佳方式是什么?其他方式?

因为当某些内容更改为Arraylist项时,线程必须传达此更改。当线程接收到通信时,它应该修改它正在“工作”的Arraylist-item。

我一直在考虑的解决方案:

  • 我可以给线程和Arraylist-item一个唯一的ID,并在需要另一个时迭代它们的数组/ arrylist。但这似乎很慢。
  • 我可以将线程对象添加到Arraylist中的自定义设备对象,所以一切都在同一个Arraylist中。但这并不像我应该做的事情。 Arraylist将经常排序,我不知道是否在排序时,所有数据都被重新定位(=>这对线程有何影响......)。或者是一个Ararylist只是一个关于对象引用的列表,它只是排序的列表,但对象仍然存在......

这两个选项似乎都不是最佳解决方案。有谁知道最好的方法是什么?

我还没有真正使用线程和Arraylists。

1 个答案:

答案 0 :(得分:1)

  

或者是一个Ararylist只是一个关于对象引用的列表,它只是排序的列表,但对象仍然存在......

是的,正如您猜测的那样只存储了参考文献。这是因为在Java中你可以拥有only references个对象。

  

将Arraylist-item连接到线程以及其他方式的最佳方法是什么?

您可以制作Map<Device, Thread>,这样您就可以轻松获得与该对象相关联的Thread。对于其他方式的关联,您应该扩展Thread类以存储对设备的引用。为了确保关联是正确的,您可以创建自己的关联类,由地图支持并负责创建和启动线程

public class Association{
   private Map<MyDevice, MyThread> map;

   public MyThread add(MyDevice device){
      MyThread t = new MyThread(device);
      map.put(device, t);
       return t;
   }

   public void stopThread(final Device d){
      final Thread t = map.get(d);
      if(t != null && t.isAlive()){
         new Thread( () -> {
            t.interrupt();
            try{ t.join(); }
            catch(InterruptedException ex){}
         }).start();

         map.remove(d);
      }
   }

   ... // Constructor, thread getter, remove logic, sorting...
}