流水号生成

生成结果:201311220001 (后四位数字递增)

 

import java.text.SimpleDateFormat;      
import java.util.Date;      
import java.util.Random;  


public class Test {

	private static int serialNumber = -1;	    //流水编号
	private static String serialDate = "-1"; 	//流水日期
	
	/**
	 * 根据当前日期,生成格式如 201301010001 的流水号
	 * 后四位递增,当达到 9999 后,会使长度改变(进万位),但不影响该方法
	 */
	public static synchronized String newSerialNumber(){
		if(serialNumber == -1 || serialDate.equals("-1")){
			//load from datasource
			serialDate = "20121212";
			serialNumber = 0;
		}
		String todayStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
		if(!serialDate.equals(todayStr)){
			serialDate = todayStr;
			serialNumber = 0;
		}
		
		StringBuilder targetStr = new StringBuilder(serialDate);
		for(int i = String.valueOf(++serialNumber).length(); i < 4; i++){
			targetStr.append("0");
		}
		targetStr.append(serialNumber);
		System.out.println(Thread.currentThread().getName()+" : "+targetStr.toString());
		return targetStr.toString();
	}
	
	 public static void main(String[] args) {
		//该测试只针对流水编号,日期变更测试需放在项目中运行,然后手动调整日期
        for(int i=0; i<1000; i++){      
            new Thread(new Runnable() {      
                @Override      
                public void run() {
                    try {      
                        Thread.sleep((int)Math.random()*1000);      
                    } catch (InterruptedException e) {      
                        e.printStackTrace();      
                    }      
                    newSerialNumber();      
                }      
            }).start();      
        }
		
    }  


}

 

 

代码模拟1000个线程进行并发测试,结果以预期顺序显示。

 

你可能感兴趣的:(生成)