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

2022-09-03 14:18:55

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

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

我想同时处理这些元素。比如说,类似 .此外,还应修复多个并发线程。ConcurrentCollectionExecutor(coll, new Callable{…}, numberOfThreads)

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


答案 1

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

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

答案 2

一个好的解决方案是:

  1. 实例化包含要处理的元素的数组阻止队列
  2. 实例化执行器服务以并发执行您的处理
  3. 实例化你的 s,给他们 ArrayBlockingQueue 作为参数Runnable
  4. 实现方法:当队列中有元素时,轮询它们并处理它们run
  5. 将您的 s 提交给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);
        }
    }
}