Java多线程分批发送消息的小例子
需求:
假设有10万个用户,现在节假日做活动,需要给每个用户发送一条活动短信,为了提高程序的效率,建议使用多线程分批发送.
这里值得注意的是:
每开一个线程都会占用CPU的资源,所以线程根据所需要的条数来决定就好,避免浪费,我们用的是一个小例子,只是说明了多线程处理提高了效率,实际的大规模场景中不建议使用,可选消息中间件来轮询处理.
Demo示例:
这里为简化展示,模拟示例10条内容,用分页处理的方式来分批发送消息,每批为2条:
结构如下:
entity
|----------- UserEntity
batch
|----------- BatchSms
utils
|----------- ListUtils
相关类如下:
UserEntity:
package entity;
public class UserEntity {
private String userId;
private String userName;
public UserEntity(String userId, String userName) {
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;
}
@Override
public String toString() {
return "UserEntity{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
'}';
}
}
BatchSms:
package batch;
import entity.UserEntity;
import utils.ListUtils;
import java.util.ArrayList;
import java.util.List;
class UserSendThread implements Runnable {
private List<UserEntity> listUser;
public UserSendThread(List<UserEntity> listUser) {
this.listUser = listUser;
}
public void run() {
for (UserEntity userEntity : listUser) {
System.out.println(Thread.currentThread().getName() + " " + userEntity.toString());
}
}
}
public class BatchSms {
public static void main(String[] args) {
// 1. 初始化数据
List<UserEntity> list = initUser();
// 2.定义每个线程分批发送大小
int userCount = 2;
// 3.计算每个线程需要分批跑的数据
List<List<UserEntity>> splitList = ListUtils.splitList(initUser(), userCount);
for (int i = 0; i < splitList.size(); i++) {
List<UserEntity> list1 = splitList.get(i);
UserSendThread userSendThread = new UserSendThread(list1);
// 4.分批发送
Thread thread = new Thread(userSendThread, "线程" + i);
thread.start();
System.out.println();
}
}
private static List<UserEntity> initUser() {
List<UserEntity> list = new ArrayList<UserEntity>();
for (int i = 0; i < 10; i++) {
list.add(new UserEntity("userid:" + i, "username" + i));
}
return list;
}
}
ListUtils:
package utils;
import java.util.ArrayList;
import java.util.List;
public class ListUtils {
/**
*
* @methodDesc: 功能描述:(list 集合分批切割)
* @param: @param
* list
* @param: @param
* pageSize
* @param: @return
* @returnType:@param list 切割集合
* @returnType:@param pageSize 分页长度
* @returnType:@return List<List<T>> 返回分页数据
*/
static public<T> List<List<T>> splitList(List<T> list, int pageSize) {
int listSize = list.size();
int page = (listSize + (pageSize - 1)) / pageSize;
List<List<T>>listArray = new ArrayList<List<T>>();
for (int i = 0; i<page; i++) {
List<T>subList = new ArrayList<T>();
for (int j = 0; j<listSize; j++) {
int pageIndex = ((j + 1) + (pageSize - 1)) / pageSize;
if (pageIndex == (i + 1)) {
subList.add(list.get(j));
}
if ((j + 1) == ((j + 1) * pageSize)) {
break;
}
}
listArray.add(subList);
}
return listArray;
}
}
启动后运行结果如下:

Java多线程分批发送消息的小例子的更多相关文章
- JBoss EAP应用服务器部署方法和JBoss 开发JMS消息服务小例子
一.download JBoss-EAP-6.2.0GA: http://jbossas.jboss.org/downloads JBoss Enterprise Application Platfo ...
- Java 正则表达式学习总结和一些小例子
从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.r ...
- Java 正则表达式的总结和一些小例子
字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了j ...
- java向邮箱发送消息失败!
出现的错误如下: org.apache.commons.mail.EmailException: Sending the email to the following server failed : ...
- PL/SQL实现JAVA中的split()方法的小例子
众所周知,java中为String类提供了split()字符串分割的方法,所以很容易将字符串以指定的符号分割为一个字符串数组.但是在pl/sql中并没有提供像java中的split()方法,所以要想在 ...
- JAVA的toString方法的一个小例子
Object是一个抽象类,他有很有方法,其中的toString方法是我们常见的一个方法,我们可以看这段代码 package com.com.day1; public class ToStringTes ...
- java中枚举(enum)小例子。之前学过枚举但是一直没用,这里有个枚举类帮你我理解下(很肤浅)
直接上枚举类,代码简单易懂. package com.jy.modules.cims.data.interact.tbj.loan.request; /** * * @author shengzhou ...
- Java 多线程编程两个简单的例子
/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override publi ...
- 多线程 multiprocessing 的几个小例子
1.Pipe import multiprocessing as multip,time from multiprocessing import Process,Pipe,Event,Conditio ...
随机推荐
- Alpha4
一.站立式会议照片 二.工作进展 (1) 昨天已完成的工作 a. 实现用户登录时获取用户信息功能 b. 实现个人目标列表,允许用户在个人目标界面浏览已设置的目标 c. 继续实现目标广场列表 (2)今天 ...
- 彻底搞懂JVM类加载器:基本概念
本文阅读时间大约9分钟. 写在前面 在Java面试中,在考察完项目经验.基础技术后,我会根据候选人的特点进行知识深度的考察,如果候选人简历上有写JVM(Java虚拟机)相关的东西,那么我常常会问一些J ...
- scrapy设置logger日志
1.在settings中设置log级别,在settings.py中添加一行: LOG_LEVEL = 'WARNING' Scrapy提供5层logging级别: CRITICAL - 严重错误 ER ...
- Shell 编程 until语句
本篇主要写一些shell脚本until语句的使用. 计算1-50的和 #!/bin/bash i=0 s=0 until [ $i -eq 51 ];do let s+=i;let i++ done ...
- Elasticsearch高版本安装head插件
安装Elasticsearch 1.安装Elasticsearch-6.5.4.tar.gz [merce@info5 ~]$ cd /appmerce/zrapp/ [merce@info5 zra ...
- lua 的匹配规则
匹配规则 .(点): 与任何字符配对 %a: 与任何字母配对 %c: 与任何控制符配对(例如\n) %d: 与任何数字配对 %l: 与任何小写字母配对 %p: 与任何标点(punctuation)配对 ...
- 前端(3)JavaScript
前端(3)JavaScript JavaScript概述 1ECMAScript和JavaScript的关系: 1996年11月,JavaScript的创造者--Netscape公司,决定将JavaS ...
- Java 中的各种锁
table th:first-of-type { width: 100px; } 锁的类型 锁的实现 乐观锁 在数据库中可以使用version版本号去实现:在Java中是使用CAS(Compare A ...
- JDOJ 2982: 最大连续子段和问题
洛谷 P1115 最大子段和 洛谷传送门 JDOJ 2982: 最大连续子段和问题 JDOJ传送门 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN, ...
- MongoDB executionStats 详细分步查询计划与分步时间(转载)
mongodb性能分析方法:explain() 为了演示的效果,我们先来创建一个有200万个文档的记录.(我自己的电脑耗了15分钟左右插入完成.如果你想插更多的文档也没问题,只要有耐心等就可以了.) ...