我正在考虑使用Collections.synchronizedList()来保存我仍然需要在线程中处理的对象.
主应用程序线程通过ThreadObjInstance.LogList.add(新的logobject(“Something to log”)将logobjects推送到列表中;并且在线程中我执行logobject x = LogList.shift();来处理它.
但是我觉得可能有更好的方法可以做到这一点,或者这是一种完全可以接受的方法吗?或者我应该使用ArrayBlockingQueue来处理他的情况?或者另一个同步的列表对象……有很多选择.
这是我第一次使用线程,所以我试图弄清楚作业队列的最佳方法是什么,以及用于维护它的对象.
我可以直接将内容添加到线程列表中吗?或者我需要在线程中使用同步方法吗?
问题基本上是:
>我在哪里存储同步的对象列表以在两个线程之间处理(在处理线程或主线程中?)
>从列表中添加/删除项目的最佳做法是什么?通过synchronized函数或直接在List对象上?
>构建作业队列时,我对List对象的选择是什么?
解决方法
如果你习惯停止主进程,直到日志记录线程清除了一些队列,那么ArrayBlockingQueue就可以了,因为它有界限(并且大小固定)并且在高负载下不会占用你的内存.
如果你习惯于在备份日志时忽略内存问题(也许你确定日志记录线程将始终保持运行),那么LinkedBlockingQueue可能更合适,因为它稍微更优化并且是无限制的.它也可以给出一个大小限制,但这是可选的.
如果您使用其中任何一个,则无需添加任何同步逻辑,因为它们自己完成所有操作.
Where do I store a Synchronised List of Objects to process between two threads (In the processing thread or the main thread?)
要么 – 您通常会在主线程中创建它并将其传递给您的日志记录线程和处理线程,因为它们都将共享它.
What is the best practice to add/remove items from the list? via synchronised function or directly on the List object?
BlockingQueue提供了一个丰富的线程安全的API添加和删除项目.
What are my choices for List objects when building a Job queue?
往上看.