多线程分批发送消息
Posted 浅谈Java基础
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程分批发送消息相关的知识,希望对你有一定的参考价值。
需求:我们需要给一批不定数量的用户都发送一条祝福信息,每个线程的工作量一定,怎么设计,提高工作效率。
下面简单模拟一下:
思路:提高效率,我们要使用多线程,每个线程的工作量一定,那么我们要给这些线程分配工作量,总工作量又不固定,我们就要用分页来动态分配。
首先定义一个用户实体类,里面有用户ID和姓名两个属性
public class User {
private String userid;
private String username;
public User(String userid, String username) {
super();
this.userid = userid;
this.username = username;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
接下来对用户进行初始化,模拟7个用户
private static List<User> initUser(){
List<User> list = new ArrayList<>();
for (int i = 0; i < 7; i++) {//设置总用户个数
list.add(new User("userid"+i, "username"+i));
}
return list;
}
然后写个线程类,里面是每个线程需要做的工作,用输出来模拟发送信息
public class ThreadWorks extends Thread{
private List<User> list;//每个线程需要发送的用户
public ThreadWorks(List<User> list) {
super();
this.list = list;
}
@Override
public void run() {
for (User user : list) {
System.out.println("线程ID:"+Thread.currentThread().getName()+"用户ID:"+user.getUserid()+"用户姓名:"+user.getUsername());
}
}
}
写了一个分页工具类,对于拿到的总工作量,确定需要开启多少个线程
public class ListUtil {
public static <T> List<List<T>> getListByPage(List<T> list, int pageSize) {
List<List<T>> listArray = new ArrayList<List<T>>();
int count = list.size();// 总任务数
// 先计算需要的线程数
int threadCount = 0;//默认线程数为0
if (count % pageSize == 0) {
threadCount = count / pageSize;
} else {
threadCount = count / pageSize + 1;
}
for (int i = 0; i < threadCount; i++) {
List<T> threadWorks = new ArrayList<>();
for (int j = i*pageSize; j < i*pageSize+pageSize && j< list.size(); j++) {
threadWorks.add(list.get(j));
}
listArray.add(threadWorks);
}
return listArray;
}
}
然后,初始化数据,定义每个线程分批发送大小,计算每个线程需要分批发送的数据,分配发送
public static void main(String[] args) {
//初始化数据
List<User> list = initUser();
//设置每个线程最大工作量
int userCount = 2;
List<List<User>> listArray = ListUtil.getListByPage(list, userCount);
for (int i = 0; i < listArray.size(); i++) {
List<User> l = listArray.get(i);
ThreadWorks th = new ThreadWorks(l);
th.start();
}
}
整个项目就完成了。。。
以上是关于多线程分批发送消息的主要内容,如果未能解决你的问题,请参考以下文章
Springboot 多线程分批切割处理 大数据量List集合 ,实用示例
Query the commission contract which without cost center(分批处理数据,多线程异步调用)