多线程(十)使用多线程分批处理信息

刺骨的言语ヽ痛彻心扉 2022-03-02 07:22 582阅读 0赞

需求分析:现在银行有一批10万的用户,需要给每个用户发一条短信 应该怎么做?假如每条短信的发送时间是1秒 使用单线程 就是10万秒 这时候我们可以用多线程分批处理。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L09ubHlvbmVGcmlzdA_size_16_color_FFFFFF_t_70

代码实现步骤如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L09ubHlvbmVGcmlzdA_size_16_color_FFFFFF_t_70 1

代码如下:

实体类

  1. package org.Thread_batch.pojo;
  2. /**
  3. * 功能描述(用户的实体类)
  4. * @author zuojie
  5. *
  6. */
  7. public class User {
  8. private String userId;
  9. private String userName;
  10. public User(String userId, String userName) {
  11. super();
  12. this.userId = userId;
  13. this.userName = userName;
  14. }
  15. public String getUserId() {
  16. return userId;
  17. }
  18. public void setUserId(String userId) {
  19. this.userId = userId;
  20. }
  21. public String getUserName() {
  22. return userName;
  23. }
  24. public void setUserName(String userName) {
  25. this.userName = userName;
  26. }
  27. @Override
  28. public String toString() {
  29. return "User [userId=" + userId + ", userName=" + userName + "]";
  30. }
  31. }

工具类

  1. package org.Thread_batch;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class ListUtils {
  5. /**
  6. *
  7. * @param list
  8. * @param pageSize
  9. * @return
  10. * @param list 切割集合
  11. * @param pageSize 分页长度
  12. * @return List<List<T>>返回分页数据
  13. */
  14. static public <T> List<List<T>> splitList(List<T> list, int pageSize) {
  15. int listSize = list.size();
  16. int page = (listSize + (pageSize - 1)) / pageSize;
  17. List<List<T>> listArray = new ArrayList<List<T>>();
  18. for (int i = 0; i < page; i++) {
  19. List<T> subList = new ArrayList<T>();
  20. for (int j = 0; j < listSize; j++) {
  21. int pageIndex = ((j + 1) + (pageSize - 1)) / pageSize;
  22. if (pageIndex == (i + 1)) {
  23. subList.add(list.get(j));
  24. }
  25. if ((j + 1) == ((j + 1) * pageSize)) {
  26. break;
  27. }
  28. }
  29. listArray.add(subList);
  30. }
  31. return listArray;
  32. }
  33. }

实现类

  1. package org.Thread_batch;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.Thread_batch.pojo.User;
  5. class UserSendThread implements Runnable {
  6. private List<User> listUser;
  7. public UserSendThread(List<User> listUser) {
  8. this.listUser=listUser;
  9. }
  10. public void run() {
  11. for (User user : listUser) {
  12. System.out.println(Thread.currentThread().getName()+","+user.toString());
  13. }
  14. System.out.println();
  15. }
  16. }
  17. public class BatchSms {
  18. public static void main(String[] args) {
  19. //1.初始化数据
  20. List<User>initUser=initUser();
  21. //2.定义每个线程分批发送大小
  22. int userCount = 2;
  23. //3.计算每个线程需要分配的数据
  24. List<List<User>> splitList = ListUtils.splitList(initUser, userCount);
  25. for (int i = 0; i < splitList.size(); i++) {
  26. List<User> list = splitList.get(i);
  27. UserSendThread userSendThread = new UserSendThread(list);
  28. //4.分配发送
  29. Thread thread = new Thread(userSendThread,"线程"+i);
  30. thread.start();
  31. }
  32. }
  33. private static List<User> initUser(){
  34. List<User>users=new ArrayList<User>();
  35. for (int i = 0; i < 20; i++) {
  36. users.add(new User("userId"+i, "userName"+i));
  37. }
  38. return users;
  39. }
  40. }

运行结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L09ubHlvbmVGcmlzdA_size_16_color_FFFFFF_t_70 2

发表评论

表情:
评论列表 (有 0 条评论,582人围观)

还没有评论,来说两句吧...

相关阅读

    相关 线一)线安全介绍

    什么是线程安全问题? 当多线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据数据冲突问题。但是做读的操作时是不会发生数据冲突问题 需求如下:100张车