我不懂线程

I don't understand threads

假设我有一个函数

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

,数组长度len相同。

现在我想在方法中调用 numOfThreads 个线程,使用工具处理每个线程 Data.Object 并将其一个一个写回 Data[],以便给定的 Data[] 和 Data[ ] 书面保持秩序。

假设一个线程现在完成了一个数据对象的处理,我如何告诉这个线程,还有剩余的数据,尚未处理和分配 "lock" 下一个数据对象处理吗? "Locking" 应该防止数据对象被多个线程多次处理。

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

它会使用 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());
}

作为多线程的新手,根据我的经验,我会做这样的事情:

考虑到每个 Data[] 项目我都有很多任务要完成。让我们说每个数据项都是一个作品。

ExecutorService为你提供了一个工厂,里面有一组worker(Thread pools)帮你完成所有的工作,Executor服务一个一个的分配工作给每个worker(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();