Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪个集合支持多个同时插入?_Java_Performance_Multithreading_Data Structures - Fatal编程技术网

Java 哪个集合支持多个同时插入?

Java 哪个集合支持多个同时插入?,java,performance,multithreading,data-structures,Java,Performance,Multithreading,Data Structures,我们正在开发一个具有多个工作线程的Java应用程序。这些线程必须向我们的UI线程交付大量计算结果。结果交付的顺序并不重要 现在,所有线程只需将其结果推送到一个同步堆栈上,但这意味着每个线程都必须等待其他线程才能交付结果 是否有一种数据结构支持同时插入,每次插入都在固定时间内完成 谢谢 Martin看看java.util.concurrent.ConcurrentLinkedQueue,java.util.concurrent.ConcurrentHashMap或java.util.Concurr

我们正在开发一个具有多个工作线程的Java应用程序。这些线程必须向我们的UI线程交付大量计算结果。结果交付的顺序并不重要

现在,所有线程只需将其结果推送到一个同步堆栈上,但这意味着每个线程都必须等待其他线程才能交付结果

是否有一种数据结构支持同时插入,每次插入都在固定时间内完成

谢谢


Martin

看看
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentHashMap
java.util.ConcurrentSkipListSet
。他们可能会做你需要的事<例如,code>ConcurrentSkipListSet声称“包含
添加
删除
操作及其变体的预期平均日志(n)时间成本。插入、删除和访问操作由多个线程同时安全执行。”

是为高争用而设计的。生产者在一端排队,消费者在另一端收集元素,因此所有内容都将按照添加的顺序进行处理

对于较低的争用和较低的空间开销,是一种更好的解决方案


编辑:尽管这不是你想要的。同时插入?您可能希望给每个线程一个输出队列(例如,
ArrayBlockingQueue
),然后让UI线程轮询单独的队列。然而,我认为您会发现上面两种
队列
实现中的一种已经足够了。

您可能需要查看的另外两种模式是

  • 每个线程都有自己的集合,轮询时返回集合并创建一个新集合,因此集合只在轮询之间保存挂起的项。线程需要保护其集合上的操作,但线程之间没有争用。这是阻塞(当UI线程从中提取更新时,每个线程不能添加到其集合中),但可以减少争用(线程之间没有争用)

  • 每个线程都有自己的集合,并将结果附加到使用Lock.tryLock()保护的公共队列。如果线程无法获取锁,它将继续处理。这使得线程阻塞等待共享队列的可能性降低

现在,所有线程只需推 他们的结果被同步化了 堆栈-但这意味着 线程必须等待其他线程 在结果公布之前


你有证据表明这确实是个问题吗?如果这些线程执行的计算甚至是最简单的一点点复杂(而且你没有几百万个线程),那么结果堆栈上的锁争用就不是问题,因为当任何给定的线程交付其结果时,所有其他人很可能都在忙于计算。

退后一步,评估性能是否是关键的设计考虑因素。不要想,要知道:评测支持它吗


若并没有,我想说一个更大的问题是设计的清晰性和可读性,而不是引入新的代码来维护。碰巧的是,如果你在使用Swing,有一个库,可以用来做你想做的事情,调用。

+1:这绝对是并发
队列
实现的情况。@Andrzej:对我来说,这听起来更像是过早优化的情况。@Michael不是真的-在可能放入大量数据的数据结构上指定常量时间插入是完全正常的,如果不使用库中的并发队列,则需要编写更多的代码,并且更难进行测试,以获得具有正确行为的代码。OP或这篇文章中都没有提到任何关于优化的内容,只是要求中的正确性。@Pete:对于队列来说,常数时间插入是很容易实现的,所以这不是一个真正的问题。我认为这个问题主要是关于并发性的。使用同步集合是解决这一问题的简单方法,当队列只包含结果而不是直接参与计算时,担心锁争用对我来说似乎是过早的优化。这个答案还有更多吗?@Ben我从IDE切换过来,在IDE中tab+enter会缩进并给出一个新行,而不是提交。你是对的,但是由于计算了大量的结果,每次计算都很快,我想可能会有碰撞。此外,我只是好奇这样的数据收集是否存在:)@Martin:确认,不要“数字”。在VisualVM的线程视图中查看您的应用程序,看看它们实际花费了多少时间等待锁定。如果它真的很重要,为什么不让每个线程在提交结果之前在更大的包中进行计算呢?它还可以通过其他方式减少开销。