zoukankan      html  css  js  c++  java
  • JAVA多线程

    直接上代码去跑发现其中的规律即可

    public class ThreadPollUtil {
        private static int corePoolSize = Runtime.getRuntime().availableProcessors();
    
        /**
         * corePoolSize 用于指定核心线程数量
         * maximumPoolSize 指定最大线程数
         * keepAliveTime和TimeUnit指定线程空闲后的最大存活时间
         */
        public static ThreadPoolExecutor executor  = new ThreadPoolExecutor(corePoolSize, corePoolSize+1, 10l, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(1000));
    
    /*
        让主线程等待  CountDownLatch 任务计数器
    
        countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
    
        是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
    */
    
    
        public static void main(String[] args) throws InterruptedException {
            //创建一个三个子线程 初始化计数器
            Map<Object, Object> map = new HashMap<>();
            CountDownLatch countDownLatch = new CountDownLatch(3);
    
            Long m=1000000000L;
            long time11 = System.currentTimeMillis();
            ThreadPollUtil.executor.submit(new Runnable() {
                @Override
                public void run() {
                    long time1 = System.currentTimeMillis();
                    int i=0;
                    for (int i1 = 0; i1 < m; i1++) {
                        i=i1+i;
                    }
                    map.put("1",i);
                    //计数器-1
                    countDownLatch.countDown();
    
                    long time2 = System.currentTimeMillis();
                    System.out.println("线程一"+(time1 - time2) + "毫秒。");
                }
            });
            ThreadPollUtil.executor.submit(new Runnable() {
                @Override
                public void run() {
                    long time1 = System.currentTimeMillis();
                    int i=0;
    
                    for (int i1 = 0; i1 < m; i1++) {
                        i=i1+i;
                    }
                    map.put("1",i);
                    //计数器-1
                    countDownLatch.countDown();
    
                    long time2 = System.currentTimeMillis();
                    System.out.println("线程二"+(time1 - time2) + "毫秒。");
                }
            });
            ThreadPollUtil.executor.submit(new Runnable() {
                @Override
                public void run() {
                    long time1 = System.currentTimeMillis();
                    int i=0;
                    for (int i1 = 0; i1 < m; i1++) {
                        i=i1+i;
                    }
                    map.put("1",i);
                    //计数器-1
                    countDownLatch.countDown();
    
                    long time2 = System.currentTimeMillis();
                    System.out.println("线程三"+(time1 - time2) + "毫秒。");
                }
            });
    
            /**
             * 通过await方法让主线程等待
             */
            countDownLatch.await();
            long time22 = System.currentTimeMillis();
            System.out.println("总线程"+(time11 - time22) + "毫秒。");
    
        }
    }

    再做个比较没有使用多线程的自上而下的逻辑

    class Xxx{
        public static void main(String[] args) throws InterruptedException {
            
    
                    long time1 = System.currentTimeMillis();
                    int i=0;
                    Long m=1000000000L;
                    for (int i1 = 0; i1 < m; i1++) {
                        i=i1+i;
                    }
            System.out.println("执行一");
                    for (int i1 = 0; i1 < m; i1++) {
                        i=i1+i;
                    }
            System.out.println("执行二");
                    for (int i1 = 0; i1 < m; i1++) {
                        i=i1+i;
                    }
            System.out.println("执行三");
            long time2 = System.currentTimeMillis();
            System.out.println("总线程"+(time1 - time2) + "毫秒。");
    
        }
    
    }
  • 相关阅读:
    Java开发常用Util工具类
    冒泡排序
    EMQ 消息服务器
    将jar文件包打成exe文件
    mina框架搭建tcp服务器:编写自定义协议及编解码器
    SpringBoot中定时任务的设置
    SpringBoot项目+Shiro(权限框架)+Redis(缓存)集成
    计算两个时间之间的天数
    关于extern的使用
    ADC采样间隔问题+TRGO作为ADC的触发源头
  • 原文地址:https://www.cnblogs.com/doge-elder/p/13181857.html
Copyright © 2011-2022 走看看