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中已有的对象,并将这些对象添加到数据库中。我有一个用构造函数参数LME对象实现Runnable
的类。有人可以告诉我一种简单的技术,我如何使用两个线程对listOfLme
进行迭代。如果可以使用Executor
做到这一点,那么我想看看如何实现。 最佳答案
为此,标准模型将使用 BlockingQueue
而不是标准的List
实现。 BlockingQueue
的定义是线程安全的,允许您安全地从队列中添加和取出队列。
不用List<LME> listOfLme
,而是创建一些全局状态,例如:
BlockingQueue<LME> queueOfLme = new ArrayBlockingQueue<LME>(100);
与您当前的
List
元素不同,您应调用以下其中一项:add
:添加到队列中,直到队列中有此项目的空间为止put()
:有时间限制的offer()
(如果失败则返回false)创建一个
put()
实现来处理您的商品:class Worker implements Runnable {
public void run() {
while (true) {
LME item = null;
try {
item = queueOfLme.take()
} catch (InterruptedException e) {
break;
}
/* do work */
}
}
}
像添加到队列中一样,有一些选项可用于拉取项目:
Runnable
:返回队列中的下一项或无限期等待,直到有一个可用的take()
:返回队列中的下一项或等待指定的时间间隔然后,创建一个工作池:
int poolSize = 10;
ExecutorService pool = Executors.newFixedThreadPool(poolSize);
for (int i = 0; i < poolSize; i++) {
pool.submit(new Worker());
}