如何在Java中同时处理Collection中的元素

ser*_*unz 16 java collections concurrency

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

for (Someclass elem : coll){
     process(elem);
}
Run Code Online (Sandbox Code Playgroud)

我想同时处理这些元素.说,像ConcurrentCollectionExecutor(coll, new Callable{…}, numberOfThreads).此外,应修复多个同时线程.

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

ste*_*ian 8

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

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


Jea*_*art 8

一个好的解决方案是:

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

代码:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)