我不明白线程

时间:2016-05-07 13:21:22

标签: java multithreading threadpool

假设我有一个功能

Data[] foo(double[] someNumbers, Data[] someData, AnalyzeTool tool, int numOfThreads)

,数组的长度为len。

现在我想在方法中调用numOfThreads线程,使用工具处理每个Data.Object并将其中一个写回Data [],以便给出的Data []和Data []写入订购。

假设一个线程现在已经完成处理一个数据对象,我怎么告诉这个线程,还有剩下的数据,尚未处理,并分配和“锁定”下一个数据对象来处理它? “锁定”应该防止多个线程多次处理数据对象。

有人有一个例子如何做到这一点?欢迎任何形式的建设性帮助。

2 个答案:

答案 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();