假设我有一个功能
Data[] foo(double[] someNumbers, Data[] someData, AnalyzeTool tool, int numOfThreads)
,数组的长度为len。
现在我想在方法中调用numOfThreads线程,使用工具处理每个Data.Object并将其中一个写回Data [],以便给出的Data []和Data []写入订购。
假设一个线程现在已经完成处理一个数据对象,我怎么告诉这个线程,还有剩下的数据,尚未处理,并分配和“锁定”下一个数据对象来处理它? “锁定”应该防止多个线程多次处理数据对象。
有人有一个例子如何做到这一点?欢迎任何形式的建设性帮助。
答案 0 :(得分:1)
它使用JDK 8和流来完成。我想象这样的事情:
List<Data> foo(List<Double> someNumbers, List<Data> someData, AnalyzeTool tool) {
return someData.parallelStream().map((t, n) -> t.doSomething(n)).collect(Collectors.toList());
}
答案 1 :(得分:0)
作为多线程新手,根据我的经验,我会做这样的事情:
考虑到每个Data []项目都要完成很多任务。让我们说每个数据项都是一项工作。
ExecutorService为您提供了一个工厂,其中有一组工作人员(线程池)来帮助您完成所有工作,Executor服务会一个接一个地为每个工作人员(Thread)分配工作他们完成了,还有更多的工作,他们被分配了。
考虑这个例子:
ExecutorService executor = Executors.newFixedThreadPools(5);
//lets say we have 5 workers with us.
//then submitting all your work (a runnable) to the factory
for(int i=0;i<n;i++){
executor.submit(new work(someData[i]));
}
执行人员将在您提交时开始工作,然后从池中取出下一个......依此类推。
就在那时,
executor.shutdown();