Java多執行緒分批發送訊息的小例子
阿新 • • 發佈:2021-01-07
需求:
假設有10萬個使用者,現在節假日做活動,需要給每個使用者傳送一條活動簡訊,為了提高程式的效率,建議使用多執行緒分批發送.
這裡值得注意的是:
每開一個執行緒都會佔用CPU的資源,所以執行緒根據所需要的條數來決定就好,避免浪費,我們用的是一個小例子,只是說明了多執行緒處理提高了效率,實際的大規模場景中不建議使用,可選訊息中介軟體來輪詢處理.
Demo示例:
這裡為簡化展示,模擬示例10條內容,用分頁處理的方式來分批發送訊息,每批為2條:
結構如下:
UserEntity:
package entity; public class UserEntity { privateString 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; } }
啟動後執行結果如下:
轉載於:https://www.cnblogs.com/charlypage/p/11524455.html