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());
    }
    

    09-12 17:42