1. 程式人生 > 實用技巧 >Java多執行緒分批發送訊息的小例子

Java多執行緒分批發送訊息的小例子

需求:

假設有10萬個使用者,現在節假日做活動,需要給每個使用者傳送一條活動簡訊,為了提高程式的效率,建議使用多執行緒分批發送.

這裡值得注意的是:

每開一個執行緒都會佔用CPU的資源,所以執行緒根據所需要的條數來決定就好,避免浪費,我們用的是一個小例子,只是說明了多執行緒處理提高了效率,實際的大規模場景中不建議使用,可選訊息中介軟體來輪詢處理.

Demo示例:

這裡為簡化展示,模擬示例10條內容,用分頁處理的方式來分批發送訊息,每批為2條:

結構如下:

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

啟動後執行結果如下:

轉載於:https://www.cnblogs.com/charlypage/p/11524455.html