iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Guava中ListenableFuture与RateLimiter如何使用
  • 359
分享到

Guava中ListenableFuture与RateLimiter如何使用

2023-06-17 06:06:46 359人浏览 泡泡鱼
摘要

Guava中ListenableFuture与RateLimiter如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概念ListenableFuture顾名思义就是可

Guava中ListenableFuture与RateLimiter如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

概念

ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用ListenableFuture Guava帮我们检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。

推荐使用第二种方法,因为第二种方法可以直接得到Future的返回值,或者处理错误情况。本质上第二种方法是通过调动***种方法实现的,做了进一步的封装。

另外ListenableFuture还有其他几种内置实现:

SettableFuture:不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,可以通过程序设置此Future的返回值或者异常信息。

CheckedFuture: 这是一个继承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future执行发生异常时,可以抛出指定类型的异常。

RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数,本文介绍RateLimiter使用。

代码示例

import java.util.concurrent.Callable;  import java.util.concurrent.ExecutionException;  import java.util.concurrent.Executors;  import java.util.concurrent.TimeUnit;     import com.Google.common.util.concurrent.FutureCallback;  import com.google.common.util.concurrent.Futures;  import com.google.common.util.concurrent.ListenableFuture;  import com.google.common.util.concurrent.ListeningExecutorService;  import com.google.common.util.concurrent.MoreExecutors;  import com.google.common.util.concurrent.RateLimiter;     public class ListenableFutureDemo {      public static void main(String[] args) {          testRateLimiter();          testListenableFuture();      }              public static void testRateLimiter() {          ListeningExecutorService executorService = MoreExecutors                  .listeningDecorator(Executors.newCachedThreadPool());             RateLimiter limiter = RateLimiter.create(5.0); // 每秒不超过4个任务被提交             for (int i = 0; i < 10; i++) {              limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞                 final ListenableFuture<Integer> listenableFuture = executorService                      .submit(new Task("is "+ i));          }      }         public static void testListenableFuture() {          ListeningExecutorService executorService = MoreExecutors                  .listeningDecorator(Executors.newCachedThreadPool());             final ListenableFuture<Integer> listenableFuture = executorService                  .submit(new Task("testListenableFuture"));                        //同步获取调用结果          try {              System.out.println(listenableFuture.get());          } catch (InterruptedException e1) {              e1.printStackTrace();          } catch (ExecutionException e1) {              e1.printStackTrace();          }                     //***种方式          listenableFuture.addListener(new Runnable() {              @Override             public void run() {                  try {                      System.out.println("get listenable future's result "                             + listenableFuture.get());                  } catch (InterruptedException e) {                      e.printStackTrace();                  } catch (ExecutionException e) {                      e.printStackTrace();                  }              }          }, executorService);             //第二种方式          Futures.addCallback(listenableFuture, new FutureCallback<Integer>() {              @Override             public void onSuccess(Integer result) {                  System.out                          .println("get listenable future's result with callback "                                 + result);              }                 @Override             public void onFailure(Throwable t) {                  t.printStackTrace();              }          });      }  }     class Task implements Callable<Integer> {      String str;      public Task(String str){          this.str = str;      }      @Override     public Integer call() throws Exception {          System.out.println("call execute.." + str);          TimeUnit.SECONDS.sleep(1);          return 7;      }  }

Guava版本

<dependency>             <groupId>com.google.guava</groupId>             <artifactId>guava</artifactId>             <version>14.0.1</version>         </dependency>

关于Guava中ListenableFuture与RateLimiter如何使用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: Guava中ListenableFuture与RateLimiter如何使用

本文链接: https://www.lsjlt.com/news/287678.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Guava中ListenableFuture与RateLimiter如何使用
    Guava中ListenableFuture与RateLimiter如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。概念ListenableFuture顾名思义就是可...
    99+
    2023-06-17
  • 如何使用Guava
    这篇文章主要介绍“如何使用Guava”,在日常操作中,相信很多人在如何使用Guava问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用Guava”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!最近在看一...
    99+
    2023-06-16
  • 如何使用springboot整合RateLimiter限流
    这篇文章主要介绍了如何使用springboot整合RateLimiter限流的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何使用springboot整合RateLimiter限流文章都会有所收获,下面我们一起...
    99+
    2023-07-02
  • PHP中使用Redis实现RateLimiter
    RateLimiter是流量控制的基本组件之一,用于控制访问频率,保护服务器免受恶意攻击,防止过载。在PHP中,我们可以使用Redis作为数据存储,实现简单而高效的RateLimiter。本文将介绍如何使用Redis实现RateLimite...
    99+
    2023-05-19
    PHP redis ratelimiter
  • SpringMVC如何使用ListenableFuture进行异步处理
    这篇文章主要介绍了SpringMVC如何使用ListenableFuture进行异步处理,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。使用 ListenableFuture ...
    99+
    2023-06-17
  • 详解Guava中EventBus的使用
    目录Guava EventBus使用场景示例核心总结Guava EventBus EventBus是Guava的事件处理机制,是设计模式中观察者模式(生产/消费者编程模型)的优雅实现...
    99+
    2022-12-23
    Guava EventBus使用 Guava EventBus
  • Java两大工具库Commons和Guava如何使用
    本文小编为大家详细介绍“Java两大工具库Commons和Guava如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java两大工具库Commons和Guava如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习...
    99+
    2023-07-05
  • SpringBoot如何使用RateLimiter通过AOP方式进行限流
    目录使用RateLimiter通过AOP方式进行限流1、引入依赖2、自定义注解3、AOP实现类4、使用SpringBoot之限流限流的基础算法Guava RateLimiter其他使...
    99+
    2024-04-02
  • Javascript中eval与with如何使用
    这篇文章将为大家详细讲解有关Javascript中eval与with如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。javascript的作用域是词法...
    99+
    2024-04-02
  • Android中Handler与Message如何使用
    这期内容当中小编将会给大家带来有关Android中Handler与Message如何使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Message:Message是在线程之间传递的消息,它可以在内部携带...
    99+
    2023-05-30
    android handler message
  • k8s中job与cronjob如何使用
    本篇内容介绍了“k8s中job与cronjob如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、前言job,顾名思义就是任务,job...
    99+
    2023-07-05
  • SparkSQL中DataFrame与DataSet如何使用
    本篇文章给大家分享的是有关SparkSQL中DataFrame与DataSet如何使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.使用IDEA开发Spark SQL1.1...
    99+
    2023-06-20
  • JS中如何使用async与await
    小编给大家分享一下JS中如何使用async与await,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、asyncasync创建一个异步函数来定义一个代码块,在其...
    99+
    2023-06-22
  • MongoDB 中如何使用Limit与Skip
    这篇文章给大家介绍MongoDB 中如何使用Limit与Skip,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。MongoDB 中Limit与Skip的使用方法详解一 MongoDB L...
    99+
    2024-04-02
  • SQLServer中ISNULL与NULLIF如何使用
    SQLServer中ISNULL与NULLIF如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。SQL Server里的 ...
    99+
    2024-04-02
  • axios中如何使用GET与POST
    这篇文章主要介绍axios中如何使用GET与POST,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!axiosaxios 是一个基于 Promise 的 HTTP 客户端,专门为浏览器...
    99+
    2024-04-02
  • location中assign与protocol如何使用
    本篇内容主要讲解“location中assign与protocol如何使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“location中assign与prot...
    99+
    2024-04-02
  • linux中如何安装与使用axel
    这篇文章将为大家详细讲解有关linux中如何安装与使用axel,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。运维工作中,常常需要下载文件,因为网站下载速度限制或者网络等原因导致下载让人无法忍受,前面有介绍...
    99+
    2023-06-28
  • vue3中的ref与reactive如何使用
    本文小编为大家详细介绍“vue3中的ref与reactive如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3中的ref与reactive如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、r...
    99+
    2023-07-06
  • JSONObject与JSONArray如何在Java中使用
    本篇文章给大家分享的是有关JSONObject与JSONArray如何在Java中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。JSONObject与JSONArray使用...
    99+
    2023-05-30
    jsonobject jsonarray java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作