如何并发处理Java集合中的元素

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我需要同时处理某个Collection实例中的元素。换句话说,而不是迭代一个Collection实例

for (Someclass elem : coll){
     process(elem);
}

我想同时处理这些元素。说,像ConcurrentCollectionExecutor(coll, new Callable{…}, numberOfThreads)。另外,许多并发线程应该被修复。

任何灵活的模式已经存在?

提问于
用户回答回答于

一个好的解决方案是:

  1. 实例化包含要处理的元素的ArrayBlockingQueue
  2. 实例化一个ExecutorService以同时执行您的处理
  3. 实例化你的Runnables给他们ArrayBlockingQueue作为参数
  4. 实现该run方法:在队列中存在元素的同时,轮询并处理它们
  5. 提交你RunnableExecutorService

代码:

BlockingQueue<Someclass> toProcess = 
    new ArrayBlockingQueue<Someclass>(coll.size(), false, coll);
ExecutorService es = Executors.newFixedThreadPool(numberOfThreads);
for(int count = 0 ; count < numberOfThreads ; ++c) {
    es.submit(new MyRunnable(toProcess));
}


private static class MyRunnable() implements Runnable {
    private final BlockingQueue<Someclass> toProcess;

    public MyRunnable(BlockingQueue<Someclass> toProcess) {
        this.toProcess = toProcess;
    }

    @Override
    public void run() {
        Someclass element = null;
        while((element = toProcess.poll()) != null) {
            process(element);
        }
    }
}
用户回答回答于

在一个名为MyRunnable的类中将process方法设置为run()方法,该类实现Runnable,其构造函数将elem作为输入并将其作为实例变量存储。然后使用:

ExecutorService executor = Executors.newFixedThreadPool(numberOfThreads);
for (Someclass elem : coll){
   Runnable worker = new MyRunnable(elem);
   executor.execute(worker);
}

扫码关注云+社区