Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading - Fatal编程技术网

Java,补充迭代器或队列

Java,补充迭代器或队列,java,multithreading,Java,Multithreading,我正在做一个涉及很多线程的项目。我有一个管理器类,其中包含线程用于计算等的模型列表。这是一个基本的同步数组列表,包含两个项。现在,我希望我的每个线程获取一个不同的项,一个当前未使用的项,类似于队列。使用foreach是不可能的,因为我有更多的项目和线程。1:20的比例。使用队列也是可能的,但我希望它能够补充,我不知道这是否是最好的方法 我的问题是:我如何解决这个问题。有些人已经建议使用同步迭代器,但这不适用于多线程 编辑:项目不会更改。我只是不希望线程同时使用同一个项目。听起来像是一个你正在寻找

我正在做一个涉及很多线程的项目。我有一个管理器类,其中包含线程用于计算等的模型列表。这是一个基本的同步数组列表,包含两个项。现在,我希望我的每个线程获取一个不同的项,一个当前未使用的项,类似于队列。使用foreach是不可能的,因为我有更多的项目和线程。1:20的比例。使用队列也是可能的,但我希望它能够补充,我不知道这是否是最好的方法

我的问题是:我如何解决这个问题。有些人已经建议使用同步迭代器,但这不适用于多线程


编辑:项目不会更改。我只是不希望线程同时使用同一个项目。

听起来像是一个你正在寻找的项目。多个线程可以安全地添加和删除,并且您不需要对其进行迭代,您只需轮询队列的头以查找新项目,就可以将新项目放入(提供)队列中。这与@AdrianPang描述的BlockingQueue略有不同,因为如果队列中没有任何内容,这里的线程将立即返回(带null)。您需要的确切集合取决于您想要的行为,但在这里使用一种或另一种类型的并发队列似乎是合适的。

您所描述的线程用例将调用队列上的take()(并阻塞直到有可用的队列),您的主线程可以提供模型对象(通过调用offer)

在我看来,每次提供相同的2000件商品似乎有点迟钝。我明白了,我不知道它们是相同的商品。应该注意到这一点。但是,你可以把它从队列中拿出来,完成后再提供。接受/提供不应该是你的瓶颈,你应该在说它“迟钝”之前验证一下,其他解决方案仍然会涉及一些同步,以确定线程应该从队列中删除哪个项目。现在你提到接受/提供,这太棒了。