多线程分批发送消息

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();
   }
 }

整个项目就完成了。。。




以上是关于多线程分批发送消息的主要内容,如果未能解决你的问题,请参考以下文章

socket如何用多线程实现同时能接收和发送消息

(Java多线程系列一)快速入门

Springboot 多线程分批切割处理 大数据量List集合 ,实用示例

并发编程专题

GB/T 28181-2016多响应消息传输探究

Query the commission contract which without cost center(分批处理数据,多线程异步调用)