Java使用多线程发送消息
在后台管理用户信息的时候,经常会用到批量发送提醒消息,首先想到的有:
(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使用多线程发送消息相关推荐
- java发送ipmsg_用Java向IPMSG发送消息
# re: 用Java向IPMSG发送消息 hehe but No File Packages Defined on sourceforge. IP MSG程序效率写的很高 曲强 Nicky 评论于 ...
- java发送ipmsg,[导入]用Java向IPMSG发送消息(转)
飞鸽传书(IP Messenger,简为IPMsg)是一个小巧方便的即时通信软件,它适合用于局域网内甚至广域网间进行实时通信和文档共享.特别是在局域网内传送文件/文件夹的速度非常快!IPMsg 是一款 ...
- Java线程怎么发送消息_Java客户端Socket如何能在阻塞线程下收到服务端发送来的消息?...
最近在写Socket客户端的时候遇到点问题 客户端在创建时创建了2个线程 一个监听键盘输入事件,使用的是buffered,当检测到输入完成时写入流发送给服务端. String content = &q ...
- RabbitMQ消息队列,发送消息失败、消息持久化、消费者失败处理方法和发送消息
项目是使用springboot项目开发的,前是代码实现,后面有分析发送消息失败.消息持久化.消费者失败处理方法和发送消息解决方法及手动确认的模式 先引入pom.xml <!--rabbitmq- ...
- 微信服务号开发----发送消息
1.微信开发文档说明 http://mp.weixin.qq.com/wiki/11/c88c270ae8935291626538f9c64bd123.html#.E5.AE.A2.E6.9C.8D. ...
- kafka Java客户端之 consumer API 多线程消费消息
kafka consumer 线程设计 Kafka Java Consumer采用的是单线程的设计.其入口类KafkaConsumer是一个双线程的设计,即用户主线程和心跳线程. 用户主线程,指的是启 ...
- java发送苹果消息慢_Spring-boot JMS 发送消息慢的解决方法
Spring-boot JMS 发送消息慢的问题解决 @Service public class Producer { @Autowired private JmsMessagingTemplate ...
- 技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化...
简介: 在本篇技巧文章中,作者兼开发人员 Nicholas Chase 向您演示如何使用用于 XML 消息传递的 Java API(Java API for XML Messaging (JAXM)) ...
- 使用java导入某个msn帐号的好友列表并发送消息
使用java导入某个msn帐号的好友列表并发送消息 导入信息的关键是如何对msn的通讯协议进行封装,这里会有两个选择,一个使用openfire(xmlapp协议),另外就是使用jml,前者配置起来相对 ...
最新文章
- TLU-Net:表面缺陷自动检测的深度学习方法
- mount windows目录
- 中国钠离子电池行业竞争需求状况及投资盈利分析报告2021-2027年版
- 陕西活性炭需求分析_20212027年中国粉末活性炭行业市场发展现状调研与投资趋势前景分析报告...
- mastercam2017安装教程
- Vue + ESLint——编译错误[‘xxx‘ is defined but never used]解决方案
- How where used list in SAP GUI is implemented
- jdbc c3p0 mysql_JDBC + MySQL使用c3p0连接池
- 彻底卸载oracle
- package和import
- 面试题22_栈的压入和弹出序列
- 数域、有限域(伽罗瓦域)
- css压缩有啥好处呢?
- Redis数据库的部署及常用命令
- Python实现excel表格合并
- FPGA篮球计分设计
- 51单片机小白零基础教程——点亮第一个小灯以及流水灯(附原理图、代码详细讲解)
- java.lang.IllegalStateException: Ambiguous handler methods
- 搜狐 Hive SQL 血缘关系解析与应用
- 第一方数据,第二方数据,第三方数据,都是什么意思?
热门文章
- caffe的python接口学习(8):caffemodel中的参数及特征的抽取
- iOS开发笔记[18/50]:在Mac OS X Lion系统中访问~/Library目录都需要点技巧
- Microsoft Sync Framework 系列(三):微软同步框架出现背景及要解决的问题
- net中一些所封装的类
- 汉字转拼音缩写的函数以及其他函数
- 微软官方windows phone开发视频教程第二天视频(附下载地址)
- rpm包时遇到Header V3 DSA signature: NOKEY时解决办法
- [代码]HDU 4335 What is N?
- [Mummy Maze] 宽度优先搜索
- 无法启动 MS DTC 事务管理器。LogInit 返回错误 0x2. 怎么办?