我不懂线程
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();
假设我有一个函数
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();