当某些更改发生时,我正在建立数据库日志记录引擎。这些更改将推送到线程中的队列中,该线程每50毫秒处理队列中的25个LogObject。
我当时正在考虑使用Collections.synchronizedList()来保存仍需要在线程中处理的对象。
主应用程序线程通过ThreadObjInstance.LogList.add(new LogObject("Something to log");
将LogObjects推送到列表中,在线程中,我执行LogObject x = LogList.shift();
对其进行处理。
但是我觉得可能会有更好的方法,或者这是一种完全可以接受的方法?还是应该针对他的情况使用ArrayBlockingQueue?或另一个同步的列表对象...有很多选择。
这是我第一次使用线程,因此我试图弄清楚什么是工作队列的最佳方法,以及用于维护它的对象。
我可以直接将内容添加到线程列表中吗?还是我需要在线程中使用同步方法?
问题基本上是:
最佳答案
您的选择主要围绕因某种原因而备份队列时要发生的情况以及要使用多少内存。
如果您愿意在日志线程清除某些队列之前暂停主进程,则ArrayBlockingQueue会很好,因为它是有界的(并且大小固定),并且在高负载下不会占用您的内存。
如果您愿意在备份日志时忽略内存问题(也许您确定日志线程将始终保持运行状态),那么LinkedBlockingQueue可能更合适,因为它稍微更优化并且不受限制。也可以给它一个大小限制,但这是可选的。
如果您使用这两种方法中的任何一种,则无需添加任何同步逻辑,因为它们本身就可以完成。
要么-您通常会在主线程中创建它,然后将其传递给日志记录线程和处理线程,因为它们都将共享它们。
BlockingQueue提供了丰富的线程安全添加和删除项的API。
看上面。