美文网首页
模拟并发及生成唯一id

模拟并发及生成唯一id

作者: 王小胖v9 | 来源:发表于2020-03-23 14:43 被阅读0次

    一、生成唯一id

    package com.wxx.demo.util;
    
    import java.text.SimpleDateFormat;
    
    /**
     * @Author : leisure
     * @Date : 2019/1/17
     */
    public class IdUtiles {
    
        private static String lead = "leisure";
        private static int Guid = 100;
    
        /**
         * 创建以字符串打头结尾自增的唯一id
         * @return
         */
        public static synchronized String creatId(){
    
            long l = System.currentTimeMillis();
    
            Guid += 1;
    
            String format = new SimpleDateFormat("yyyy").format(l);
    
            if (Guid > 999){
                Guid = 100;
            }
    
            String id = lead + format + l + Guid;
            return id;
        }
    }
    

    二、模拟高并发场景

    package com.wxx.demo;
    
    import com.wxx.demo.util.IdUtiles;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.concurrent.CountDownLatch;
    
    @RunWith(SpringRunner.class)
    //@SpringBootTest(classes = LeisureWebApplication.class)
    public class TaskTest {
    
        @Test
        public void taskTest(){
    
            Runnable task = new Runnable() {
    
                int count = 0;
    
                @Override
                public void run() {
                    count ++;
    
                    String id = IdUtiles.creatId();
                    System.out.println(count);
                    System.out.println(id);
                    System.out.println("Thread : " + Thread.currentThread().getId());
    
                    try {
                        Thread.sleep(1000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
    
                }
            };
    
            double executeTime = this.executeTime(100, task);
            System.out.println("执行时间: " + executeTime);
        }
    
        private double executeTime(int taskCount,Runnable task){
    
            CountDownLatch start = new CountDownLatch(1);
            CountDownLatch end = new CountDownLatch(taskCount);
    
            for (int i = 0; i < taskCount ; i++) {
                Thread thread = new Thread() {
    
                    public void run(){
                        try {
                            start.await();
    
                            try {
                                task.run();
                            }finally {
                                end.countDown();
                            }
    
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                };
    
                thread.start();
            }
    
            long startTime = System.nanoTime();
    
            //开启开关
            start.countDown();
    
            long endTime = System.nanoTime();
    
            return endTime - startTime;
        }
    }
    
    
    public class Guid {  
          
       public static String getGuid(){  
           int machineId = 1;//最大支持1-9个集群机器部署  
           int hashCodev = UUID.randomUUID().toString().hashCode();  
           System.out.println(UUID.randomUUID().toString());  
           if(hashCodev < 0){  
               //有可能是负数  
               hashCodev = -hashCodev;  
           }  
           //"%015d"的意思:0代表不足位数的补0,这样可以确保相同的位数,15是位数也就是要得到到的字符串长度是15,d代表数字。  
           return machineId + String.format("%015d", hashCodev);  
       }   
    

    相关文章

      网友评论

          本文标题:模拟并发及生成唯一id

          本文链接:https://www.haomeiwen.com/subject/sjdwyhtx.html