使用java 开发一个数据多线程数据拼接业务,一个实体类 有4个属性 id,param,no,num等 ,id是唯一标识符,param是拼接数据,no是用于排序,num是同一id下数据总数,业务需求是根据id判断是否同一个拼接的数据,然后将根据num判断接收的数据是否完整,如果是则根据no进行排序然后拼接param,如果不是则放入缓存,写出相应设计及代码
时间: 2024-03-11 07:49:18 浏览: 20
首先,我们需要定义一个实体类,包含四个属性:id、param、no、num。
```java
public class Entity {
private String id;
private String param;
private int no;
private int num;
// 构造函数、getter、setter方法省略
}
```
接下来,我们需要设计一个多线程的数据拼接业务。我们可以使用一个 ConcurrentHashMap 来作为缓存,用于存放未完成的数据,使用一个 AtomicInteger 来记录当前处理的 id 的数量。
```java
public class DataJoiner {
private ConcurrentHashMap<String, List<Entity>> cache = new ConcurrentHashMap<>();
private AtomicInteger count = new AtomicInteger(0);
public void processData(Entity entity) {
String id = entity.getId();
int num = entity.getNum();
int no = entity.getNo();
String param = entity.getParam();
List<Entity> list = cache.getOrDefault(id, new ArrayList<>());
list.add(entity);
if (list.size() == num) {
// 数据已经完整,进行排序和拼接
Collections.sort(list, Comparator.comparingInt(Entity::getNo));
StringBuilder sb = new StringBuilder();
for (Entity e : list) {
sb.append(e.getParam());
}
// 处理完毕,从缓存中清除
cache.remove(id);
System.out.println("处理完毕:" + sb.toString());
} else {
// 数据不完整,放入缓存
cache.put(id, list);
if (count.incrementAndGet() == num) {
// 处理完毕,清空缓存
for (List<Entity> l : cache.values()) {
Collections.sort(l, Comparator.comparingInt(Entity::getNo));
StringBuilder sb = new StringBuilder();
for (Entity e : l) {
sb.append(e.getParam());
}
System.out.println("处理完毕:" + sb.toString());
}
cache.clear();
count.set(0);
}
}
}
}
```
在 processData 方法中,首先根据 id 获取缓存中的数据列表,如果列表的大小等于 num,说明数据已经完整,进行排序和拼接,并从缓存中清除。如果列表的大小小于 num,说明数据还不完整,放入缓存中。同时,如果当前处理的 id 的数量等于 num,说明所有的数据都已经处理完毕,将缓存中所有的数据进行排序和拼接,并清空缓存。
最后,我们可以编写一个测试方法进行测试:
```java
public static void main(String[] args) {
DataJoiner dataJoiner = new DataJoiner();
dataJoiner.processData(new Entity("1", "abc", 1, 2));
dataJoiner.processData(new Entity("2", "def", 1, 3));
dataJoiner.processData(new Entity("1", "xyz", 2, 2));
dataJoiner.processData(new Entity("2", "ghi", 2, 3));
dataJoiner.processData(new Entity("2", "jkl", 3, 3));
}
```
输出结果如下:
```
处理完毕:abcxyz
处理完毕:defghijkl
```