Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java多线程共享一个全局映射变量_Java_Multithreading - Fatal编程技术网

Java多线程共享一个全局映射变量

Java多线程共享一个全局映射变量,java,multithreading,Java,Multithreading,现在我有一个要求,在一个全局hashMap中处理100万个数据,显然应该使用多线程。今天我尝试了两个schames: 1#将巨大的hashMap划分为若干个小hashMap,并用若干个线程进行处理(一个线程处理一个hashMap)。它具有良好的性能。显然,它不需要多线程之间的同步 2#我想使用多线程来处理相同且巨大的hashMap。我将从hashMap中删除已处理的项目。我尝试了各种方法,但失败了。我的关键点是:我可以在生成新线程时获取实时hashMap值,但所有线程都无法通知对方当所有线程线程

现在我有一个要求,在一个全局hashMap中处理100万个数据,显然应该使用多线程。今天我尝试了两个schames:

1#将巨大的hashMap划分为若干个小hashMap,并用若干个线程进行处理(一个线程处理一个hashMap)。它具有良好的性能。显然,它不需要多线程之间的同步

2#我想使用多线程来处理相同且巨大的hashMap。我将从hashMap中删除已处理的项目。我尝试了各种方法,但失败了。我的关键点是:我可以在生成新线程时获取实时hashMap值,但所有线程都无法通知对方当所有线程线程正在运行。已同步无法解决我的问题

2 中,我如何解决此问题。高级感谢

以下是我的部分代码:

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
});