zoukankan      html  css  js  c++  java
  • JAVA 递归线程池测试 ExecutorService / ForkJoinPool

    测试工具使用递归的方式获取子进程的Msg消息,目前有2种常用的ExecutorService / ForkJoinPool

    为了测试哪种效果较好,我们来写个测试Demo,循环5555555次+1(加锁),统计每种执行耗时

    int nCpu = Runtime.getRuntime().availableProcessors();

    ExecutorService executorPool  = Executors.newFixedThreadPool(nCpu);
    ForkJoinPool forkJoinPool = new ForkJoinPool(nCpu);

    TestData:5555555 , RunTime:1543 ms :ExecutorService executorPool

    TestData:5555555 , RunTime:746 ms :ForkJoinPool forkJoinPool

    结果很明显,递归线程池使用ForkJoinPool更佳,2倍的执行效率

    测试流程图

    package test;
    
    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ForkJoinPool;
    
    /**
     *
     * @author weimjsam
     */
    public class TestThrad {
    
        public int addNum = 0;
    
        //get cpu 
        int nCpu = Runtime.getRuntime().availableProcessors();
    
        //Thread
        ExecutorService taskPush = Executors.newFixedThreadPool(nCpu);
        ExecutorService executorPool = Executors.newFixedThreadPool(nCpu);
        ForkJoinPool forkJoinPool = new ForkJoinPool(nCpu);
    
        private void TaskPush(int iTestAdd) {
            CompletableFuture.runAsync(() -> {
    
                for (int i = 0; i < nCpu; i++) {
                    CompletableFuture.runAsync(() -> TestRun(iTestAdd), forkJoinPool);
                }
    
            }, taskPush);
        }
    
        private void TestRun(int iTestAdd) {
            CompletableFuture.runAsync(() -> TestAdd(iTestAdd), forkJoinPool)
                    .thenRun(() -> CheckOver(iTestAdd));
        }
    
        private void TestAdd(int iTestAdd) {
            synchronized (this) {
                if (addNum < iTestAdd) {
                    addNum = addNum + 1;
                }
            }
        }
    
        private void CheckOver(int iTestAdd) {
            if (addNum < iTestAdd) {
                TestRun(iTestAdd);
            }
        }
    
        public void Test(int iTestMax) {
            TaskPush(iTestMax);
        }
    
    }
    

      

  • 相关阅读:
    什么是X86和X86-64
    PyQt 5 的学习引言
    GraphQL实战篇(一)
    GraphQL基础篇
    .net之设计模式
    .net面向对象设计原则
    Entity Framework (EF) Core工具创建一对多和多对多的关系
    NLog组件
    给dao层注入jdbcTemplate时的一个强行bug(jdbcDaoSupport不要随便用!用了要记得!)
    使用工厂模式解耦和IoC思想
  • 原文地址:https://www.cnblogs.com/gegelaopiaoke/p/10610184.html
Copyright © 2011-2022 走看看