日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java使用多线程发送消息

發布時間:2024/4/15 java 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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使用多线程发送消息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。