多线程下生成UUID

本文通过多线程实例验证了在Java中使用`java.util.UUID`生成UUID的情况,探讨了在并发环境下UUID重复的可能性,指出尽管理论上存在重复的极小概率,但在实际应用中可以视为唯一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个实例是验证多线程下使用java.util.UUID生成UUID不会发生重复的(其实UUID发生重复的概率是很小很小的 )

 

import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Callable;

public class GenUUId implements Callable { //实现Callable接口

	public String genUuid(){
		String uuid = UUID.randomUUID().toString();
		return uuid;
	}

	@Override
	public Object call() throws Exception {//覆盖call()方法,并将结果返回,该结果就是FutureTask的get()获得值
		Set<String> sets = new HashSet<String>();
		for(int i=0;i<1000;i++){
			sets.add(genUuid());
		}
		return sets;
	}
}

 

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * 这个实例是为了演示UUID.randomUUID()的生成的数据会不会重复<br/>
 * 当然这个列子因为太弱了,还不能检测出发生重复的UUID,但是UUID是由可能发生重复的,只是几率很小很小很小<br/>
 * 关于UUID的介绍:see <a href="http://www.ietf.org/rfc/rfc4122.txt"> <br/>
 *设计思路:
 *1. 后台开启5个线程(放在一个线程池里)<br/>
 *2.开启1000个FutureTask(这是一个异步任务,其结合Callable可以实现从子线程里获得线程执行的结果,弥补了Thead和Runnable拿不到结果的不足)<br/>
 *3.每个FutureTask里的Callable产生1000个UUID,然后把这1000个UUID放大Set里
 * 程序运行结束如果Set.size()==1000*1000,则没有产生重复的UUID,但依然不能说明UUID.randomUUID()在多线程下不会重复。
 * */
public class TestUUId {
	public static void main(String[] args){
		List<FutureTask<Set<String>>> futureTasks = new ArrayList<FutureTask<Set<String>>>();//为了后面统计这些FutureTask的结果准备的
		ExecutorService pool = Executors.newFixedThreadPool(5);//创建一个拥有5个线程的线程池,其大小起码要小于等于futureTasks的吧,否则不就浪费了吗
		for(int i=0;i<1000;i++){
			FutureTask<Set<String>> futureTask = new FutureTask<Set<String>>(new GenUUId());//可以跳到GenUUId的类,看其实现
			futureTasks.add(futureTask);//便于下面的for循环统计结果
			pool.submit(futureTask);//将FutureTask提交到线程池中,有子线程执行
		}

		Set<String> sets = new HashSet<String>();
		for(FutureTask<Set<String>> futureTask:futureTasks){
			try{
				sets.addAll(futureTask.get());//统计结果
			}catch (Exception e){
				//TODO
			}
		}
		pool.shutdown();
		for(String str:sets){
			System.out.println(str);
		}
		System.out.println("多线程计算后的总结果是:" + sets.size());
	}



}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值