Java多线程共享一个全局映射变量
现在我有一个要求,在一个全局hashMap中处理100万个数据,显然应该使用多线程。今天我尝试了两个schames: 1#将巨大的hashMap划分为若干个小hashMap,并用若干个线程进行处理(一个线程处理一个hashMap)。它具有良好的性能。显然,它不需要多线程之间的同步 2#我想使用多线程来处理相同且巨大的hashMap。我将从hashMap中删除已处理的项目。我尝试了各种方法,但失败了。我的关键点是:我可以在生成新线程时获取实时hashMap值,但所有线程都无法通知对方当所有线程线程正在运行。已同步无法解决我的问题 在2 中,我如何解决此问题。高级感谢 以下是我的部分代码:Java多线程共享一个全局映射变量,java,multithreading,Java,Multithreading,现在我有一个要求,在一个全局hashMap中处理100万个数据,显然应该使用多线程。今天我尝试了两个schames: 1#将巨大的hashMap划分为若干个小hashMap,并用若干个线程进行处理(一个线程处理一个hashMap)。它具有良好的性能。显然,它不需要多线程之间的同步 2#我想使用多线程来处理相同且巨大的hashMap。我将从hashMap中删除已处理的项目。我尝试了各种方法,但失败了。我的关键点是:我可以在生成新线程时获取实时hashMap值,但所有线程都无法通知对方当所有线程线程
class DoJob implements Runnable{
private HugeDataHotelFormalMultiShare share = new HugeDataHotelFormalMultiShare();
DoJob(HugeDataHotelFormalMultiShare share){
this.share = share;
}
@Override
public void run() {
testHotelMatchCommonShare(share.origMap);
}
}
如果您只想以多线程的方式逐步浏览giant HashMap,您可以使用并行流(它们正是为此目的制作的):
HashMap giantMap=newhashmap();
giantMap.entrySet().parallelStream().forEach((条目)->{
Object key=entry.getKey();
对象值=entry.getValue();
//你的逻辑
});
旁注:流需要Java8为什么synchronized不能解决您的问题?这看起来像是ConcurrentHashmap的工作@看,当不懂线程的人说“显然应该使用多线程”时,我总是很担心。@Kayaman的确,初学者不知道线程是最难的主题CS@Kayaman我在多线程方面没有太多经验。昨天我对多线程的理解真的被这个问题弄糊涂了。今天我解决了它。顺便说一句,我来这里的目的是找到一个最好的解决方案,而不是担心。我的问题已经解决了,我会试试你的意见。谢谢。
HashMap<Object, Object> giantMap=new HashMap<>();
giantMap.entrySet().parallelStream().forEach((entry)->{
Object key=entry.getKey();
Object value=entry.getValue();
//your logic with it
});