偷网站源码直接建站,医院网站怎么建设,wordpress优化服务,北京当地网站 点线程池异步的基础知识
详情见#xff1a;https://blog.csdn.net/sinat_32502451/article/details/133039624
线程池执行多任务#xff0c;获取返回值
线程池的 submit()方法#xff0c;可以提交任务#xff0c;并返回 Future接口。 而 future.get()#xff0c;可以获取…线程池异步的基础知识
详情见https://blog.csdn.net/sinat_32502451/article/details/133039624
线程池执行多任务获取返回值
线程池的 submit()方法可以提交任务并返回 Future接口。 而 future.get()可以获取到任务的结果但是get()方法会阻塞阻塞时间过长会占用过多的系统资源。 因此在使用时一般都会用 get(long timeout, TimeUnit unit) 设置超时时间。
//该线程池仅用于示例实际建议使用自定义的线程池
ExecutorService executor Executors.newCachedThreadPool();
FutureString future executor.submit(() - task1);
//阻塞获取返回值2秒超时
String result future.get(2, TimeUnit.SECONDS);不过get(long timeout, TimeUnit unit) 比较适合设置单个任务的超时时间在多任务的情况下哪怕设置了超时时间阻塞的时间也会特别长。 比如有5个任务同时执行每个任务设置2s的超时时间在极端情况下这些任务全部阻塞并超时那总共要耗费的时间可能会达到10s这明显是不能接受的。 如果超时时间设置得太小又可能出现频繁超时。在多任务获取返回值的场景更适合使用 CompletableFuture。
CompletableFuture基础知识
详情见 https://blog.csdn.net/sinat_32502451/article/details/132819472
CompletableFuture多任务异步
CompletableFuture多任务异步不需要返回值的话主要使用 allOf()。
allOf()就是将多个任务汇总成一个任务所有任务都完成时触发。allOf()可以配合get()一起使用。
public static void allOfTest() throws Exception {ExecutorService executorService Executors.newCachedThreadPool();CompletableFutureVoid cf1 CompletableFuture.runAsync(() - System.out.println(cf1 ok.), executorService);CompletableFutureVoid cf2 CompletableFuture.runAsync(() - System.out.println(cf2 ok.), executorService);//将两个任务组装成一个新的任务总共的超时时间为2sCompletableFuture.allOf(cf1, cf2).get(2, TimeUnit.SECONDS);}CompletableFuture获取返回值
只有一个任务时CompletableFuture的使用跟线程池异步有点类似。 主要用到 CompletableFuture.supplyAsync(): 异步处理任务有返回值。 public static void supplyAsyncGet() {//该线程池仅用于示例实际建议使用自定义的线程池ExecutorService executorService Executors.newCachedThreadPool();CompletableFutureString completableFuture CompletableFuture.supplyAsync(()- runTask(), executorService);String result null;try {//获取返回值2秒超时result completableFuture.get(2, TimeUnit.SECONDS);} catch (Exception e) {logger.error(completableFuture.get error., e);}logger.info(result:result);}private static String runTask() {try {//任务耗时。可以分别设置1000和3000看未超时和超时的不同结果。Thread.sleep(1000);} catch (InterruptedException e) {logger.error(runTask error., e);}return taskResult;}CompletableFuture多任务异步获取返回值汇总结果
有几个方法比较关键
supplyAsync(): 异步处理任务有返回值whenComplete()任务完成后触发该方法有返回值。还有两个参数第一个参数是任务的返回值第二个参数是异常。allOf()就是所有任务都完成时触发。allOf()可以配合get()一起使用。
示例如下 /*** 异步多任务。汇总返回值*/public static void allOfGet() {//该线程池仅用于示例实际建议使用自定义的线程池ExecutorService executorService Executors.newCachedThreadPool();//线程安全的list适合写多读少的场景ListString resultList Collections.synchronizedList(new ArrayList(50));CompletableFutureString completableFuture1 CompletableFuture.supplyAsync(() - runTask(result1, 1000), executorService).whenComplete((result, throwable) - {//任务完成时执行。用list存放任务的返回值if (result ! null) {resultList.add(result);}//触发异常if (throwable ! null) {logger.error(completableFuture1 error:{}, throwable);}});CompletableFutureString completableFuture2 CompletableFuture.supplyAsync(() - runTask(result2, 1500), executorService).whenComplete((result, throwable) -{if (result ! null) {resultList.add(result);}if (throwable ! null) {logger.error(completableFuture2 error:{}, throwable);}});ListCompletableFutureString futureList new ArrayList();futureList.add(completableFuture1);futureList.add(completableFuture2);try {//多个任务CompletableFuture[] futureArray futureList.toArray(new CompletableFuture[0]);//将多个任务汇总成一个任务总共耗时不超时2秒CompletableFuture.allOf(futureArray).get(2, TimeUnit.SECONDS);} catch (Exception e) {logger.error(CompletableFuture.allOf Exception error., e);}ListString list new ArrayList(resultList);list.forEach(System.out::println);}private static String runTask(String result, int millis) {try {//此处忽略实际的逻辑用sleep代替//任务耗时。可以分别设置1000和3000看未超时和超时的不同结果。Thread.sleep(millis);} catch (InterruptedException e) {logger.error(supplyAsyncGet error.);}return result;}
相关资料
https://blog.csdn.net/sinat_32502451/article/details/132819472