gpt4 book ai didi

java - 多线程处理List的内容

转载 作者:行者123 更新时间:2023-11-30 09:12:43 24 4
gpt4 key购买 nike

SomeClass {
while(itr.hasNext() {
if (MDS.contains(subj)) {

} else {
listOfLme.add(new LME(subj.getName(),
promptBuilder.toString(), cobBuilder.toString(), openInt));
}
}
} //end class

您好,我有一个循环将 LME 对象添加到 LinkedList。当 LME 对象被添加到 List 时,我需要多个线程迭代 List 中已有的内容并将这些对象添加到数据库中。我有一个实现 Runnable 的类,它带有构造函数参数 LME 对象。谁能告诉我一个简单的技巧,如何使用两个线程对 listOfLme 进行两次迭代。如果这可以通过 Executor 实现,那么我想看看如何实现。

最佳答案

这个的标准模型将使用 BlockingQueue 而不仅仅是标准 List执行。 BlockingQueue根据定义,s 是线程安全的,允许您安全地从队列中添加和获取。

而不是 List<LME> listOfLme ,你会创建一些全局状态,比如:

BlockingQueue<LME> queueOfLme = new ArrayBlockingQueue<LME>(100);

与您当前的 List 不同,你在哪里add元素,你应该调用其中之一:

  • put() : 添加到队列中,等待队列中有此项目的空间
  • offer() : 有时间限制 put() (不成功则返回false)

创建一个 Runnable实现以处理您的元素:

class Worker implements Runnable {
public void run() {
while (true) {
LME item = null;
try {
item = queueOfLme.take()
} catch (InterruptedException e) {
break;
}
/* do work */
}
}
}

与添加到队列一样,有一些用于拉取项目的选项:

  • take() : 返回队列中的下一个项目或无限期地等待直到有一个可用
  • poll() : 返回队列中的下一个项目或等待指定的时间间隔

然后,创建一个 worker 池:

int poolSize = 10;
ExecutorService pool = Executors.newFixedThreadPool(poolSize);
for (int i = 0; i < poolSize; i++) {
pool.submit(new Worker());
}

关于java - 多线程处理List的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21368971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com