• 转:模拟高并发的情况


    模拟高并发的情况

    在多线程编程里,CountDownLatch是一个很好的计数器工具。

    它所在的包:

    package java.util.concurrent

    常用的两个方法:

    1、计数器减一

       public void countDown() {

            sync.releaseShared(1);

        }

    2、线程等待,在计算器未到达0之前会一直等待

      public void await() throws InterruptedException {

            sync.acquireSharedInterruptibly(1);

        }

    好,下面来演示两个demo.

    1、等待所有子线程执行完成后再执行主线程的情况

    2、模拟高并发的情况

    代码如下:

    package com.figo.study.test;

    import java.util.concurrent.CountDownLatch;

    /**

     * test CountDownLatch

     * @author figo

     * 20180605.

     */

    public class TestSomething {

    public static void  main(String[] args) {

    //testWaitThread();

    testConcurrent();

            }


    /**

    * 1、模拟所有子线程都执行完成后再执行主线程

    * countdownLatch计数,模拟子线程执行完成之后再执行主线程

    * 这个也可以用future来实现

    */

    public static void testWaitThread()

    {

    final CountDownLatch latch = new CountDownLatch(2);

    new Thread(){

                public void run() {

                    try {

                        System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");

                       Thread.sleep(3000);

                       System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");

                       latch.countDown();

                   } catch (InterruptedException e) {

                       e.printStackTrace();

                   }

                };

            }.start();

            new Thread(){

                public void run() {

                    try {

                        System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");

                        Thread.sleep(3000);

                        System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");

                        latch.countDown();

                   } catch (InterruptedException e) {

                       e.printStackTrace();

                   }

                };

            }.start();

            try {

                System.out.println("等待2个子线程执行完毕...");

               latch.await();

               System.out.println("2个子线程已经执行完毕");

               System.out.println("继续执行主线程");

           } catch (InterruptedException e) {

               e.printStackTrace();

           }

    }

    /**

         * 线程数量

         */

        public static final int THREAD_NUM = 100;

        /**

         * 开始时间

         */

        private static long startTime = 0L;

        /**

         * 2、模拟高并发

         */

    public static void testConcurrent()

    {


        try {

                startTime = System.currentTimeMillis();

                System.out.println("CountDownLatch started at: " + startTime);

                // 初始化计数器为1

                CountDownLatch countDownLatch = new CountDownLatch(1);

                for (int i = 0; i < THREAD_NUM; i ++) {

                    new Thread(new Run(countDownLatch)).start();

                }

                // 启动多个线程

                countDownLatch.countDown();

            } catch (Exception e) {

                System.out.println("Exception: " + e);

            }

    }


    /**

         * 线程类

         */

        private static class Run implements Runnable {

            private final CountDownLatch startLatch;

            public Run(CountDownLatch startLatch) {

                this.startLatch = startLatch;

            }

            @Override

            public void run() {

                try {

                    // 线程等待

                    startLatch.await();

                    // 模拟耗时操作

                    Thread.sleep(3000);

                    long endTime = System.currentTimeMillis();

                    System.out.println(Thread.currentThread().getName() + " ended at: " + endTime + ", cost: " + (endTime - startTime) + " ms.");

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        }


    }
    ---------------------
    作者:志飞
    来源:CSDN
    原文:https://blog.csdn.net/figo0423/article/details/80604921
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    天下大事必作于细,天下难事必作于易
    mybatis 配置 log4j 日志
    org/w3c/dom/ElementTraversal 错误解决办法
    naoting
    FreeMarker 生成Java、mybatis文件
    在mysql数据库中创建oracle scott用户的四个表及插入初始化数据
    音视频编码格式汇总
    java 二进制数字符串转换工具类
    Linux nohup 命令
    Linux & 命令
  • 原文地址:https://www.cnblogs.com/kira2will/p/10486567.html
Copyright © 2020-2023  润新知