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).此外,应修复多个同时线程.
任何灵活的模式已经存在?
将进程方法设置为名为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)
一个好的解决方案是:
Runnables给它们ArrayBlockingQueue作为参数run方法:在队列中有元素时,轮询它们并处理它们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)
| 归档时间: |
|
| 查看次数: |
2604 次 |
| 最近记录: |