java并行的执行两个任务

Posted 琅琊山二当家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java并行的执行两个任务相关的知识,希望对你有一定的参考价值。

java并行的执行两个任务 ,每个任务又包含多个小任务,下面是一种代码实践的成果

 ExecutorService executor1 = Executors.newSingleThreadExecutor();
        Map<String, Integer> tenantIdNumMap = new HashMap<>();
        FutureTask<Map<String, Integer>> future1 =
                new FutureTask<>(() -> 
                    long time1 = System.currentTimeMillis();
                    ConcurrentHashMap<String, Integer> finalTenantIdNumMap = new ConcurrentHashMap<>();
                    tenantIdList.parallelStream().forEach(tenantId -> 
                        HashMap<String, Object> reqOtherColumn = new HashMap<>();
                        reqOtherColumn.put("beginTime", beginTime);
                        reqOtherColumn.put("endTime", endTime);
                        reqOtherColumn.put("tenantIdList", Arrays.asList(tenantId));
                        //真正的任务在这里执行,这里的返回值类型为String,可以为任意类型
                        List<HashMap<String, String>> tenantNumByIdDistinctInfo = volumeMapper.getTenantNumById(reqOtherColumn);
                        tenantNumByIdDistinctInfo.parallelStream().forEach(map -> 
                            String tenant_id = map.get("tenant_id");
                            Integer idMun = finalTenantIdNumMap.get(tenant_id);
                            if (idMun == null) 
                                finalTenantIdNumMap.put(tenant_id, 1);
                             else 
                                finalTenantIdNumMap.put(tenant_id, ++idMun);
                            
                        );
                    );
                    long time2 = System.currentTimeMillis();
                    logger.warn("------33333----2222222--: " + (time2 - time1));
                    return finalTenantIdNumMap;
                );
        executor1.execute(future1);

        ExecutorService executor2 = Executors.newSingleThreadExecutor();
        Map<String, Integer> tenantIdSubjectNumMap = new HashMap<>();
        FutureTask<Map<String, Integer>> future2 =
                new FutureTask<>(() -> 
                    ConcurrentHashMap<String, Integer> finalTenantIdSubjectNumMap = new ConcurrentHashMap<>();
                    long time1 = System.currentTimeMillis();
                    tenantIdList.parallelStream().forEach(tenantId -> 
                        HashMap<String, Object> reqOtherColumn = new HashMap<>();
                        reqOtherColumn.put("beginTime", beginTime);
                        reqOtherColumn.put("endTime", endTime);
                        reqOtherColumn.put("tenantIdList", Arrays.asList(tenantId));
                        List<HashMap<String, String>> tenantSubjectNumByIdDistinctInfo = volumeMapper.getTenantSubjectNumById(reqOtherColumn);
                        tenantSubjectNumByIdDistinctInfo.parallelStream().forEach(map -> 
                            String tenant_id = map.get("tenant_id");
                            Integer idMun = finalTenantIdSubjectNumMap.get(tenant_id);
                            if (idMun == null) 
                                finalTenantIdSubjectNumMap.put(tenant_id, 1);
                             else 
                                finalTenantIdSubjectNumMap.put(tenant_id, ++idMun);
                            
                        );
                    );
                    long time2 = System.currentTimeMillis();
                    logger.warn("------4444----2222222--: " + (time2 - time1));
                    return finalTenantIdSubjectNumMap;
                );
        executor2.execute(future2);


        try 
            tenantIdNumMap = future1.get(30000, TimeUnit.MILLISECONDS);//取得结果,同时设置超时执行时间为5秒。同样可以用future.get(),不设置执行超时时间取得结果
         catch (InterruptedException e) 
            future1.cancel(true);
         catch (ExecutionException e) 
            future1.cancel(true);
         catch (TimeoutException e) 
            future1.cancel(true);
         finally 
            executor1.shutdown();
        

        try 
            tenantIdSubjectNumMap = future2.get(30000, TimeUnit.MILLISECONDS);//取得结果,同时设置超时执行时间为5秒。同样可以用future.get(),不设置执行超时时间取得结果
         catch (InterruptedException e) 
            future2.cancel(true);
         catch (ExecutionException e) 
            future2.cancel(true);
         catch (TimeoutException e) 
            future2.cancel(true);
         finally 
            executor2.shutdown();
        

以上是关于java并行的执行两个任务的主要内容,如果未能解决你的问题,请参考以下文章

java并行的执行两个任务

java并行的执行两个任务

读Java8函数式编程笔记05_数据并行化

Java面试之多线程

Java面试之多线程

多线程 fork/join 并行计算