在后台管理用户信息的时候,经常会用到批量发送提醒消息,首先想到的有:

(1)、循环发送列表,逐条发送。优点是:简单,如果发送列表很少,而且没有什么耗时的操作,是比较好的一种选择,缺点是:针对大批量的发送列表,不可取,耗时,程序会出现严重的阻塞问题。

(2)、使用队列(BlockingQueue),开启多个线程,分为三个部分。一部分负责处理将发送列表放入队列;一部分负责从队列中读取并发送消息;第三部分负责监视队列是否为空及后续的操作。

(3)、以下说到的这种模式,使用Future、Callable来返回发送结果,觉得是一种比较好的方式,很简单代码也很详细,就不介绍了。

代码如下:

public class PublishMsgTest {//创建固定大小为100 的线程池private static ExecutorService service = Executors.newFixedThreadPool(100);//发送消息的业务逻辑方法public int sendMsg(List<Integer> receivers,String content){long begin = System.nanoTime();AtomicInteger ai = new AtomicInteger(0);List<Future<Integer>> list = new ArrayList<>();//循环发送消息for(int i=0;i<receivers.size();i++){Integer receiver = receivers.get(i);//使用Future,Callable实现发送消息后返回发送结果Future<Integer> future = service.submit(new Callable<Integer>() {@Overridepublic Integer call() throws Exception {//调用相对比较耗时的发送消息接口Thread.sleep(200);//发送消息int resultStatus = sendMsg(receiver,content);System.out.println("接收者【"+receiver+"】,发送结果【"+resultStatus+"】");return resultStatus;}});list.add(future);}System.out.println("-----------------------"+(System.nanoTime()-begin)/1000_000d+"-----------------------");//循环接收发送结果,相当于一个使线程同步的过程,这个过程是比较耗时的for(int i=0;i<list.size();i++){try {int resultStatus = list.get(i).get();if(resultStatus == 0){//发送成功
                    ai.incrementAndGet();}} catch (Exception e) {e.printStackTrace();} }System.out.println("发送消息结束,耗时:"+(System.nanoTime()-begin)/1000_000d);return ai.get();}public static void main(String[] args){PublishMsgTest pmt = new PublishMsgTest();//待接收人List<Integer> receivers = new ArrayList<Integer>();for(int i=0;i<1000;i++){receivers.add(i);}String content = "群发消息_测试代码";int successCount = pmt.sendMsg(receivers, content);System.out.println("共有【"+receivers.size()+"】接收者,发送成功【"+successCount+"】");}//完成发送消息private int sendMsg(Integer receiver, String content) {if(receiver%2 == 0){//模拟被2整除,即为发送成功return 0;}return 1;}

以上代码的执行结果:

-----------------------14.786889-----------------------
接收者【2】,发送结果【0】
接收者【3】,发送结果【1】
接收者【4】,发送结果【0】
接收者【0】,发送结果【0】
接收者【6】,发送结果【0】
接收者【7】,发送结果【1】
接收者【1】,发送结果【1】
接收者【5】,发送结果【1】
接收者【10】,发送结果【0】
.
.
.
.
接收者【994】,发送结果【0】
接收者【993】,发送结果【1】
接收者【992】,发送结果【0】
接收者【996】,发送结果【0】
接收者【999】,发送结果【1】
接收者【998】,发送结果【0】
接收者【997】,发送结果【1】
发送消息结束,耗时:2033.053433
共有【1000】接收者,发送成功【500】

转载于:https://www.cnblogs.com/quanenmin/p/4914620.html

Java使用多线程发送消息相关推荐

  1. java发送ipmsg_用Java向IPMSG发送消息

    # re: 用Java向IPMSG发送消息 hehe but No File Packages Defined on sourceforge. IP MSG程序效率写的很高 曲强 Nicky 评论于 ...

  2. java发送ipmsg,[导入]用Java向IPMSG发送消息(转)

    飞鸽传书(IP Messenger,简为IPMsg)是一个小巧方便的即时通信软件,它适合用于局域网内甚至广域网间进行实时通信和文档共享.特别是在局域网内传送文件/文件夹的速度非常快!IPMsg 是一款 ...

  3. Java线程怎么发送消息_Java客户端Socket如何能在阻塞线程下收到服务端发送来的消息?...

    最近在写Socket客户端的时候遇到点问题 客户端在创建时创建了2个线程 一个监听键盘输入事件,使用的是buffered,当检测到输入完成时写入流发送给服务端. String content = &q ...

  4. RabbitMQ消息队列,发送消息失败、消息持久化、消费者失败处理方法和发送消息

    项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败.消息持久化.消费者失败处理方法和发送消息解决方法及手动确认的模式 先引入pom.xml <!--rabbitmq- ...

  5. 微信服务号开发----发送消息

    1.微信开发文档说明 http://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html#.E5.AE.A2.E6.9C.8D. ...

  6. kafka Java客户端之 consumer API 多线程消费消息

    kafka consumer 线程设计 Kafka Java Consumer采用的是单线程的设计.其入口类KafkaConsumer是一个双线程的设计,即用户主线程和心跳线程. 用户主线程,指的是启 ...

  7. java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法

    Spring-boot JMS 发送消息慢的问题解决 @Service public class Producer { @Autowired private JmsMessagingTemplate ...

  8. 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...

    简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...

  9. 使用java导入某个msn帐号的好友列表并发送消息

    使用java导入某个msn帐号的好友列表并发送消息 导入信息的关键是如何对msn的通讯协议进行封装,这里会有两个选择,一个使用openfire(xmlapp协议),另外就是使用jml,前者配置起来相对 ...

最新文章

  1. TLU-Net:表面缺陷自动检测的深度学习方法
  2. mount windows目录
  3. 中国钠离子电池行业竞争需求状况及投资盈利分析报告2021-2027年版
  4. 陕西活性炭需求分析_20212027年中国粉末活性炭行业市场发展现状调研与投资趋势前景分析报告...
  5. mastercam2017安装教程
  6. Vue + ESLint——编译错误[‘xxx‘ is defined but never used]解决方案
  7. How where used list in SAP GUI is implemented
  8. jdbc c3p0 mysql_JDBC + MySQL使用c3p0连接池
  9. 彻底卸载oracle
  10. package和import
  11. 面试题22_栈的压入和弹出序列
  12. 数域、有限域(伽罗瓦域)
  13. css压缩有啥好处呢?
  14. Redis数据库的部署及常用命令
  15. Python实现excel表格合并
  16. FPGA篮球计分设计
  17. 51单片机小白零基础教程——点亮第一个小灯以及流水灯(附原理图、代码详细讲解)
  18. java.lang.IllegalStateException: Ambiguous handler methods
  19. 搜狐 Hive SQL 血缘关系解析与应用
  20. 第一方数据,第二方数据,第三方数据,都是什么意思?

热门文章

  1. caffe的python接口学习(8):caffemodel中的参数及特征的抽取
  2. iOS开发笔记[18/50]:在Mac OS X Lion系统中访问~/Library目录都需要点技巧
  3. Microsoft Sync Framework 系列(三):微软同步框架出现背景及要解决的问题
  4. net中一些所封装的类
  5. 汉字转拼音缩写的函数以及其他函数
  6. 微软官方windows phone开发视频教程第二天视频(附下载地址)
  7. rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
  8. [代码]HDU 4335 What is N?
  9. [Mummy Maze] 宽度优先搜索
  10. 无法启动 MS DTC 事务管理器。LogInit 返回错误 0x2. 怎么办?