多线程异步执行的java示例

🔴大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂

前言

场景:用户发给机器人消息之后,让机器人依次将消息转发给所配置上的好友或者群聊上。

需求是这样的,每次发消息的时候,不能给选中的群聊或者好友一下子都发完,我们得增加个延时。而且这个延时是有要求的:

  1. 多线程异步执行:避免线程堵塞

  2. 每个人都需要延迟,而不是说延迟这个消息的操作(比如配置了5个人,那么就是第一个人是5秒后执行,第二个是10秒后执行,第三个是15秒后执行…)

基于上面的这两个问题,所以我琢磨出来了下面的方法。

代码实现

实现方法:


    /**
     * 发送文本消息转发消息
     */
    public void scheduleDelayedTaskZfMsg(int delay, String msg, String[] toWxids) {
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);
        for (int i = 0; i < toWxids.length; i++) {
            final int index = i;
            final int taskDelay = delay * i;
            scheduler.schedule(() -> {
                try {
                    String wxid = toWxids[index];
                    log.info("延迟执行时间:{},信息:{},wxid:{}", Instant.now(), msg, wxid);
                    // 这里可以放置发送消息后的后续操作,例如记录日志等
                    WeChatVoV37 weChatVo = new WeChatVoV37();
                    WeChatUtils weChatUtils = new WeChatUtils();
                    MqttMsgControl msgControl = new MqttMsgControl();
                    weChatVo.setUserName(wxid);
                    weChatVo.setIsUnicodeEscape(0);
                    weChatVo.setContent(msg);
                    //调用发送的方法
                    msgControl.sendMsgV37(weChatVo, weChatUtils);
                } catch (Exception e) {
                    log.error("发送消息失败", e);
                }
            }, taskDelay, TimeUnit.SECONDS);
        }
        // 关闭 scheduler,如果需要的话,可以在程序结束时关闭
        scheduler.shutdown();
    }

调用方法:

 @GetMapping("testTime")
    public String testTime() {
        //构建一个字符串数组
        String [] toWxids = new String[4];
        toWxids[0] = "aa";
        toWxids[1] = "bb";
        toWxids[2] = "cc";
        toWxids[3] = "dd";
        delayedTaskService.scheduleDelayedTaskZfMsg(3,"1111",toWxids);
        return "success";
    }

image.png

我这边设置的是每隔3秒执行一次。

真是环境下的调用方法:

/**
     * 私聊转发消息
     * @param fromWxid  发送的人
     * @param msg       发送的消息
     */
    private void siLiaoZhuanFa(String fromWxid,String msg) {
        if (!msg.contains("转发:")) {
            //不转发
            return;
        }
        //查看私聊转发的状态
        String siliaozhuanfaStatus = fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "status");
        if (!siliaozhuanfaStatus.equals("yes")) {
            //未开启
            return;
        }
        msg = msg.replace("转发:", "");
        //需要转发
        //获取发送人是不是配置的里面的
        String admins = fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "admins");
        if (admins.contains(fromWxid)) {
            //需要转发,获取需要转发的群或者好友
            String toWxids = fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "toWxid");
            //获取延迟的时间
            int yanchi = Integer.parseInt(fileUtiils.readIni(Contant.INI_FILE, "siliaozhuanfa", "yanchi"));
            String[] toWxid = toWxids.split(",");
            //将消息延迟转发
            delayedTaskService.scheduleDelayedTaskZfMsg(yanchi, msg, toWxid);
        } else {
            log.error("当前发送人:{},没有在配置的里面,不转发", fromWxid);
        }

    }

##green##
🟢
至此,此文over。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆雄雄

哎,貌似还没开张来着呢~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值