海口网站建设网页制作公司,做调查问卷能挣钱的网站,建设银行网站预约取款,wordpress博客模板查询大家好,我是烤鸭#xff1a;今天给大家说的是多线程并发的异步监听的情况。这里不得不说一下CompletableFuture这个类#xff0c;普通我们执行多线程的时候只需要另外启动一条线程。
说一下线程的3种方式#xff1a;extends Thread#xff0c;implements Runnable#xff…大家好,我是烤鸭今天给大家说的是多线程并发的异步监听的情况。这里不得不说一下CompletableFuture这个类普通我们执行多线程的时候只需要另外启动一条线程。
说一下线程的3种方式extends Threadimplements Runnableimplements 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 ArrayListInteger integers new ArrayList();CompletableFutureInteger 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);});CompletableFutureInteger 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);});CompletableFutureInteger 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和想法实现欢迎交流。