线程之间的Java同步列表.最佳实践

Tsc*_*cka 6 java multithreading

当发生某些更改时,我正在创建数据库日志记录引擎.这些更改将被推送到一个线程中的队列,该线程每隔50ms处理队列中的25个LogObject.

我正在考虑使用Collections.synchronizedList()来保存我仍然需要在线程中处理的对象.

主应用程序线程通过ThreadObjInstance.LogList.add(new LogObject("Something to log");我在线程中将LogObjects推送到列表中LogObject x = LogList.shift();来处理它.

但是我觉得可能有更好的方法可以做到这一点,或者这是一种完全可以接受的方法吗?或者我应该使用ArrayBlockingQueue来处理他的情况?或者另一个同步的列表对象......有很多选择.

这是我第一次使用线程,所以我试图弄清楚作业队列的最佳方法是什么,以及用于维护它的对象.我可以直接将内容添加到线程列表中吗?或者我需要在线程中使用同步方法吗?

问题基本上是:

  1. 在哪里存储同步的对象列表以在两个线程之间进行处理(在处理线程或主线程中?)
  2. 从列表中添加/删除项目的最佳做法是什么?通过synchronized函数或直接在List对象上?
  3. 构建作业队列时,我对List对象的选择是什么?

Old*_*eon 3

您的选择主要围绕当队列由于某种原因备份时您想要发生的情况以及您想要使用多少内存。

如果您愿意停止主进程,直到日志记录线程清除了一些队列,那么 ArrayBlockingQueue可以了,因为它是有界的(并且大小固定)并且不会在高负载下占用您的内存。

如果您愿意在日志记录备份时忽略内存问题(也许您确定日志记录线程将始终保持同步),那么 LinkedBlockingQueue可能更适合,因为它稍微更优化并且是无界的。也可以给它一个大小限制,但这是可选的。

如果您使用其中任何一个,则无需添加任何同步逻辑,因为它们会自行完成所有工作。

在哪里存储要在两个线程之间处理的同步对象列表(在处理线程或主线程中?)

要么 - 您通常会在主线程中创建它并将其传递给您的日志记录线程和处理线程,因为它们都会共享它。

从列表中添加/删除项目的最佳实践是什么?通过同步函数还是直接在 List 对象上?

BlockingQueue提供了丰富的 API,用于线程安全地添加和删除项目。

在构建作业队列时,我对 List 对象有哪些选择?

往上看。

  • @MichaelDibbets在这种情况下,如果事情变得困难并且您的队列增长超出限制,您必须阻止处理。要么是其中之一,要么是另一个。(“BlockingQueue.put()”是插入方法,如果队列已满,则会阻塞。) (2认同)