多线程在Java中修改集合?

多线程在Java中修改集合?,java,multithreading,Java,Multithreading,我正在从事的项目需要对数据库进行大量查询。原则上,我使用两种类型的查询: 从excel文件中读取,检查几个参数,并在数据库中查询命中率。然后这些点击被注册为一系列自定义类。任何命中都可能(而且很可能)发生多次,因此这部分代码将检查并更新扩展ArrayList的自定义列表实现中的命中 对于找到的每个命中,执行详细查询并解析输出,以便在(I)中创建的类获得详细信息 我想我会使用多个线程来优化时间。然而,我真的不能想出一个好方法来解决这些项目存储在集合中时出现的问题。稍加阐述;在整个执行过程中,对象都

我正在从事的项目需要对数据库进行大量查询。原则上,我使用两种类型的查询:

  • 从excel文件中读取,检查几个参数,并在数据库中查询命中率。然后这些点击被注册为一系列自定义类。任何命中都可能(而且很可能)发生多次,因此这部分代码将检查并更新扩展ArrayList的自定义列表实现中的命中

  • 对于找到的每个命中,执行详细查询并解析输出,以便在(I)中创建的类获得详细信息

  • 我想我会使用多个线程来优化时间。然而,我真的不能想出一个好方法来解决这些项目存储在集合中时出现的问题。稍加阐述;在整个执行过程中,对象都应该被(I)和(II)修改

    我故意没有c/p任何代码,因为这将是一大块有意义的代码。。我希望上面的描述有一定的意义


    谢谢,

    在Java 5及更高版本中,您可以使用或。在早期的Java版本中,只有后一种选择可用。如果您绝对希望坚持您提到的自定义
    ArrayList
    实现,则情况也是如此

    CopyOnWriteArrayList
    如果容器的读取频率远高于写入(更改)频率,那么它是可行的,根据您的解释,这似乎是正确的。它的原子
    addIfAbsent()
    方法甚至可以帮助简化代码

    [Update]再三考虑,地图听起来更适合您描述的用例。因此,如果从列表更改为地图,是一种选择,你应该考虑。strong>[/Update]


    更改容器中的对象不会影响容器本身,但是您需要确保对象本身是线程安全的。

    只需使用新的
    java.util.concurrent
    包即可


    ConcurrentLinkedQueue
    ConcurrentHashMap
    这样的类已经存在,可以供您使用,并且都是线程安全的。

    CopyOnWriteArrayList是一个非常慢(并且内存不足)的数据结构-它也不会扩展ArrayList,因此他可以使用更有效的类,比如ConcurrentLinkedQueue。另外,只要您坚持生产者/消费者模型(即线程从队列中删除对象,对其进行编辑,然后将其放回(或放回另一个队列)),那么对象本身就不需要是线程安全的。@Gandalf,CopyOnWriteArrayList仅在写入时速度较慢。对我来说,上面的帖子所描述的与生产者-消费者模型非常不同,所以排队不是一个选项。多亏了彼得和甘道夫,很抱歉回复太晚。我一直在为该项目处理其他一些功能。我还没有机会尝试这些,因为多线程是非优先级的,有利于实现其他一些函数。如果我有机会试试这些,我会回来的。再次感谢