我需要在文件中写一个arraylist 它会一直充满,当它变得太大时,我需要开始编写它。
所以我想检查arraylist sise是否大于100,然后附加文件并写入当前行。
但问题是有时它不会被填满几个小步骤,我想将数据转储到文件中。
所以我的第二个想法是让另一个线程检查每隔几秒钟是否有行并将其转储到文件中
但是我需要管理线程之间的锁定。
我的问题是:
1.多线程设计是否正常?
2.是否有支持任何形式多线程的arraylist?
答案 0 :(得分:2)
答案 1 :(得分:2)
您可以使用Collections.synchronizedList制作同步列表。
答案 2 :(得分:2)
我建议您使用Queue<E>
的正确实施,而不是ArrayList
。如果您只是将数据附加到列表中,然后将其转储到文件中,从列表中删除已保存的项目,则队列是一个更好的选择。
某些实现是线程安全的,甚至允许调用程序线程阻塞,直到队列中出现实际内容 - 这比使用轮询线程要好得多。 BlockingQueue看起来很有希望。
答案 3 :(得分:2)
从您的问题出现,大多数情况下您会执行写入操作,而且单个线程和将间歇性地检查列表的大小。 另外,你不能使用普通的旧ArrayList。
同步列表然后使用锁来访问列表看起来像是一种过度杀伤力。 而是检查将检查大小。
如果要访问多个线程中的列表,那么为了避免ConcurrentModificationException,请使用@Ludevik建议的方法
还有其他方法,但为了简单起见,@ Ludevik方法符合要求。
答案 4 :(得分:1)
您可以使用矢量代替数组。因为向量是线程安全的。
答案 5 :(得分:1)
ArrayList不是线程安全的,但是你可以使用Collections.synchronizedList()获得一个线程安全的列表
答案 6 :(得分:1)
您需要使用Collections.synchronizedList(List)来创建线程安全列表。但是,您仍需要同步操作,例如添加或删除,并将更新同步到列表中保存的对象。
答案 7 :(得分:0)
简单的解决方案是使用Collections.synchronizedList(list)
或Vector
。但是,有一个问题。
如上所述创建的同步列表/ iterator()
的{{1}}方法未同步。因此,如果使用显式迭代器,使用Vector
或使用依赖于迭代器的复制构造函数来复制它,则没有什么可以阻止线程尝试将新元素添加到列表中。
这可能导致并发修改异常。为避免这个问题,您需要自己进行锁定。
最好使用并发Queue类,以便将东西写入文件的线程不需要迭代列表。