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并发编程核心概念一览