线程之间的Java同步列表.最佳实践
当发生某些更改时,我正在创建数据库日志记录引擎.这些更改将被推送到一个线程中的队列,该线程每隔50ms处理队列中的25个LogObject.
我正在考虑使用Collections.synchronizedList()来保存我仍然需要在线程中处理的对象. 主应用程序线程通过ThreadObjInstance.LogList.add(新的LogObject(“Something to log”)将LogObjects推送到列表中;并且在线程中我执行LogObject x = LogList.shift();来处理它. 但是我觉得可能有更好的方法可以做到这一点,或者这是一种完全可以接受的方法吗?或者我应该使用ArrayBlockingQueue来处理他的情况?或者另一个同步的列表对象……有很多选择. 这是我第一次使用线程,所以我试图弄清楚作业队列的最佳方法是什么,以及用于维护它的对象. 问题基本上是: >我在哪里存储同步的对象列表以在两个线程之间处理(在处理线程或主线程中?) 解决方法
您的选择主要围绕当您因某种原因备份队列以及您想要使用多少内存时想要发生的事情.
如果你习惯停止主进程,直到日志记录线程清除了一些队列,那么ArrayBlockingQueue就可以了,因为它有界限(并且大小固定)并且在高负载下不会占用你的内存. 如果你习惯于在备份日志时忽略内存问题(也许你确定日志记录线程将始终保持运行),那么LinkedBlockingQueue可能更合适,因为它稍微更优化并且是无限制的.它也可以给出一个大小限制,但这是可选的. 如果您使用其中任何一个,则无需添加任何同步逻辑,因为它们自己完成所有操作.
要么 – 您通常会在主线程中创建它并将其传递给您的日志记录线程和处理线程,因为它们都将共享它.
BlockingQueue提供了一个丰富的线程安全的API添加和删除项目.
往上看. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |