大家好,我是烤鸭:
今天给大家说的是多线程并发的异步监听的情况。
这里不得不说一下CompletableFuture这个类,普通我们执行多线程的时候只需要另外启动一条线程。
说一下线程的3种方式:

extends Thread,implements Runnable,implements Callable。

同步的实现方式有很多。这里贴一下我的。

这个handler是可以注入其他的比如service或者dao,完成业务逻辑,我这里是注入的redis。

package com.mys.my.wechat.handler;import com.mys.my.wechat.config.redis.RedisClient;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Executor;@Service("musicHandler")
public class MusicHandler {public static Log logger = LogFactory.getLog(MusicHandler.class);public String redisString;public String openId;@Autowiredprivate RedisClient redisClient;@Autowiredprivate Executor taskAsyncPool;public void doAllHandler() {try {taskAsyncPool.execute(new Runnable() {@Overridepublic void run() {logger.info("xiami 任务启动");Date time = new Date();
//                  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//                  String re_StrTime = sdf.format(time);//过期时间1小时redisClient.set("xiamiMusic:"+openId,redisString,60*60);}});} catch (Exception e) {e.printStackTrace();}}
}

调用:

                   //存redismusicHandler.redisString = toJson;musicHandler.openId = openId;musicHandler.doAllMusicHandler();

以上就是同步调用,但是这样只是执行,你无法监听结果。

我现在说一下场景:

烧水的同时,洗衣机洗衣服,电脑下载,手机充电,我们生活中

也会有同时干几件事的情况,而需求是这几件事都干完了我才能出门,多线程确实能执行,但是怎么监听结果呢。

以上也许可以说时间是可以预测的。

但是具体的业务场景,如果需要你去调用4个接口,而他们之间的没有任何影响,但是又必须

4个接口都执行完才能返回数据。这样如果实现多线程的异步监听呢?

最常用的就是爬虫,我想同时抓取几个网站或者几个网页的数据,如果是单线程,效率很低。

多线程又必须保证每条线程完成抓取并返回数据。以下是一个小例子。

用CompletableFuture,代码如下:

package com.mys.my.wechat.service.impl;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.CompletableFuture;final Integer res = 0;final ArrayList<Integer> integers = new ArrayList<>();CompletableFuture<Integer> completableFuture1 = CompletableFuture.supplyAsync(() -> {//模拟执行耗时任务System.out.println("task 1 doing...");try {Thread.sleep(1000);} catch (Exception e) {e.printStackTrace();}//返回结果return 1;});//注册完成事件completableFuture1.thenAccept(result -> {integers.add(1);});CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {//模拟执行耗时任务System.out.println("task 2 doing...");try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}//返回结果return 1;});//注册完成事件completableFuture2.thenAccept(result -> {integers.add(1);});CompletableFuture<Integer> completableFuture3 = CompletableFuture.supplyAsync(() -> {//模拟执行耗时任务System.out.println("task 3 doing...");try {Thread.sleep(3000);} catch (Exception e) {e.printStackTrace();}//返回结果return 1;});//注册完成事件completableFuture3.thenAccept(result -> {integers.add(1);});while(true){try {Thread.sleep(1000);if(integers.size()== 3){System.out.println("done");break;}System.out.println("s:"+integers.size());} catch (InterruptedException e) {e.printStackTrace();}}}

这里我们可以看到,主线程一直在监听,其他新开启的3个线程,如果他们执行完毕,就可以返回数据,
如果他们有没执行完的,主线程就一直等。这样就分工明确了,主线程的任务就是监视其他是否完毕,

而同时开启3条线程执行速度也会很快。

这只是一个demo和想法实现,欢迎交流。

CompletableFuture的多线程和异步监听实现相关推荐

  1. java 异步监听_java异步处理与监听器

    计算机的内存是有限的.tomcat 7 中,最多的线程为200,.为了最大化,需要异步,这样可以节省线程.具体什么是异步,为什么要用异步,我不想多写了,会好累的,我怕写着写着就不想继续下去了. 异步有 ...

  2. Socket编程(C语言实现)——TCP协议(网络间通信AF_INET)的流式(SOCK_STREAM)+报式(SOCK_DGRAM)传输【多线程+循环监听】

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  3. Java 使用Tailer类监听文件

    线程创建的三种方式:   FileDataListener listener = new FileDataListener(path,this);         //使用单线程池线程监听文件     ...

  4. 框架源码专题:Spring的事件监听、发布机制 ApplicationListener

    文章目录 1.Spring内置事件 2.自定义事件 3.事件监听器 4.事件发布 publishEvent 4.Spring事件原理 5. 面试题:怎么样可以在所有Bean创建完后做扩展代码? 6. ...

  5. SpringBoot | 第三十二章:事件的发布和监听

    前言 今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节.想想,spring的事件应该是在3.x版本就发布的功能了,并越来越完善,其为bean和bean之间的消息通信提供了 ...

  6. Android 使用AsyncTask 后监听异步加载完毕的动作

    AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便.这里就不详细说具体的使用方法了,同学可以Google 一下,很多. 场景模拟 当我们在加载一个列表的时候,比如GridView ,这 ...

  7. 异步Udp监听关闭 出现异常,访问已释放的资源或者其他错误的解决方法

    在开发异步Udp程序的过程中,通常在关闭UDP的时候回遇到诸如socket 访问已释放的资源之类的异常,如下简单操作下: 1 Udp的监听 2 this.serverSocket = new Sock ...

  8. IOS开发教程第一季之03多线程day3--最大并发数,队列的暂停,取消和恢复、操作优先级、线程监听、多线程下UITableView显示图片案例

    1.NSOperation–最大并发数 什么是并发数 同时执行的任务数,比如同时开3个线程执行3个任务,并发数就是3 最大并发数的相关方法 -(NSInteger)maxConcurrentOpera ...

  9. Android 使用AsyncTask 后监听异步加载完毕的动作-(by terry-龙)

    AsyncTask 的使用方法网上有很多例子,使用起来也非常的方便.这里就不详细说具体的使用方法了,同学可以Google 一下,很多. 场景模拟 当我们在加载一个列表的时候,比如GridView ,这 ...

最新文章

  1. linux下的qt缺少iostream,c – iostream:没有这样的文件或目录
  2. xml常用操作(js、sql、vb)
  3. 用django将数据从数据库提出并分页展示
  4. java web利用mvc结构实现简单聊天室功能
  5. Python多线程学习
  6. java 微信转账_实现微信转账功能
  7. jmeter 取json值_JMeter中JSON数据处理
  8. mips j指令_MIPS处理器 MIPS指令集(上)
  9. c语言程序100例第5题
  10. ThinkPHP实现登陆功能
  11. 新浪微博客户端(27)-格式化工具条显示数字
  12. JavaWeb开发中的乱码问题
  13. linux安装php7.3
  14. 紫猫中控-脚本界面的基本设计和代码结构
  15. 基于jquery读取csv
  16. Processing创意编程(入门篇)
  17. 拼多多——多多的数字组合
  18. 【天翼云服务器】新服务器centos环境搭建,按照docker环境,解决相关配置问题。
  19. 直播 相关技术文章 相关调研文章
  20. Openstack Queens版本双节点架构笔记9,Ceph安装1:

热门文章

  1. 前端学习(3106):react-hello-jsx小练习
  2. [html] 你认为写出什么样的html代码才是好代码呢?
  3. [js] 写一个获取页面中所有checkbox的方法
  4. 前端学习(2623):Vuex初步识别
  5. 前端学习(2571):为什么使用vuex
  6. “约见”面试官系列之常见面试题之第四十九篇之ie6bug的解决办法(建议收藏)
  7. 前端学习(1922)vue之电商管理系统电商系统之渲染角色数据
  8. 前端学习(903):js同步和异步
  9. 前端学习(682):switch和if else if
  10. 前端学习(312):高度塌陷