demo如下,如果是多个节点的服务,就相应替换为全局队列(如redis队列)处理.
public static void main(String[] args) {
/*
* 测试按比例下发数据
*/
int i = 1000000;//模拟请求次数
int countA = 0;
int countB = 0;
int countC = 0;
LinkedBlockingDeque l = new LinkedBlockingDeque();
while (i >0){
//保证队列有数据
initQueData(l);
if (l.isEmpty()){
//队列没数据,直接退出
break;
}
//取出第一个
Object first = l.removeFirst();
System.out.println("取出--->"+ first);
if (ObjectUtil.equal(first, "a")){
countA++;
}
if (ObjectUtil.equal(first, "b")){
countB++;
}
if (ObjectUtil.equal(first, "c")){
countC++;
}
i--;
}
System.out.println("end:a="+countA+"----b="+countB+"----c="+countC);
}
/**
* 初始化数据
* @methodName initQueData
* @param l
*/
private static void initQueData(LinkedBlockingDeque l) {
//队列没有数据就进行初始化
if (l.isEmpty()){
int a = 5;//50%的比例
int b = 3;
int c = 2;
add2Que("a",a,l);
add2Que("b",b,l);
add2Que("c",c,l);
}
}
/**
* 添加数据
* @methodName add2Que
* @param id
* @param size
* @param l
*/
private static void add2Que(String id, int size, LinkedBlockingDeque l) {
if (size <= 0){
return;
}
List<String> list = new ArrayList<>(size);
while (size > 0){
list.add(id);
size--;
}
if (CollectionUtil.isNotEmpty(list)){
l.addAll(list);
}
}
本文探讨了如何使用LinkedBlockingDeque实现按比例分配请求,通过模拟数据操作演示了如何使用全局队列处理多节点服务中的并发请求。
552

被折叠的 条评论
为什么被折叠?



