本文主要研究一下Elasticsearch的RunOnce

RunOnce

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/concurrent/RunOnce.java

public class RunOnce implements Runnable {private final Runnable delegate;private final AtomicBoolean hasRun;public RunOnce(final Runnable delegate) {this.delegate = Objects.requireNonNull(delegate);this.hasRun = new AtomicBoolean(false);}@Overridepublic void run() {if (hasRun.compareAndSet(false, true)) {delegate.run();}}/*** {@code true} if the {@link RunOnce} has been executed once.*/public boolean hasRun() {return hasRun.get();}
}
  • RunOnce实现了Runnable接口,它的构造器要求输入Runnable,同时构造了hasRun变量;run方法会先使用compareAndSet将hasRun由false设置为true,如果成功则执行代理的Runnable的run方法;hasRun方法则返回hasRun值

实例

elasticsearch-7.0.1/server/src/test/java/org/elasticsearch/common/util/concurrent/RunOnceTests.java

public class RunOnceTests extends ESTestCase {public void testRunOnce() {final AtomicInteger counter = new AtomicInteger(0);final RunOnce runOnce = new RunOnce(counter::incrementAndGet);assertFalse(runOnce.hasRun());runOnce.run();assertTrue(runOnce.hasRun());assertEquals(1, counter.get());runOnce.run();assertTrue(runOnce.hasRun());assertEquals(1, counter.get());}public void testRunOnceConcurrently() throws InterruptedException {final AtomicInteger counter = new AtomicInteger(0);final RunOnce runOnce = new RunOnce(counter::incrementAndGet);final Thread[] threads = new Thread[between(3, 10)];final CountDownLatch latch = new CountDownLatch(1);for (int i = 0; i < threads.length; i++) {threads[i] = new Thread(() -> {try {latch.await();} catch (InterruptedException e) {throw new RuntimeException(e);}runOnce.run();});threads[i].start();}latch.countDown();for (Thread thread : threads) {thread.join();}assertTrue(runOnce.hasRun());assertEquals(1, counter.get());}public void testRunOnceWithAbstractRunnable() {final AtomicInteger onRun = new AtomicInteger(0);final AtomicInteger onFailure = new AtomicInteger(0);final AtomicInteger onAfter = new AtomicInteger(0);final RunOnce runOnce = new RunOnce(new AbstractRunnable() {@Overrideprotected void doRun() throws Exception {onRun.incrementAndGet();throw new RuntimeException("failure");}@Overridepublic void onFailure(Exception e) {onFailure.incrementAndGet();}@Overridepublic void onAfter() {onAfter.incrementAndGet();}});final int iterations = randomIntBetween(1, 10);for (int i = 0; i < iterations; i++) {runOnce.run();assertEquals(1, onRun.get());assertEquals(1, onFailure.get());assertEquals(1, onAfter.get());assertTrue(runOnce.hasRun());}}
}
  • testRunOnce方法验证了顺序多次执行runOnce的场景;testRunOnceConcurrently方法则验证了并发多次执行runOnce的场景;testRunOnceWithAbstractRunnable则验证了使用AbstractRunnable作为runnable的场景

小结

RunOnce实现了Runnable接口,它的构造器要求输入Runnable,同时构造了hasRun变量;run方法会先使用compareAndSet将hasRun由false设置为true,如果成功则执行代理的Runnable的run方法;hasRun方法则返回hasRun值

doc

  • RunOnce

转载于:https://my.oschina.net/go4it/blog/3060427

聊聊Elasticsearch的RunOnce相关推荐

  1. 聊聊Elasticsearch的ExponentiallyWeightedMovingAverage

    序 本文主要研究一下Elasticsearch的ExponentiallyWeightedMovingAverage ExponentiallyWeightedMovingAverage elasti ...

  2. 聊聊elasticsearch的RoutingService

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究一下elasticsearch的RoutingService RoutingService elasticsearch ...

  3. 聊聊Elasticsearch的TimedRunnable

    序 本文主要研究一下Elasticsearch的TimedRunnable TimedRunnable elasticsearch-7.0.1/server/src/main/java/org/ela ...

  4. 聊聊Elasticsearch的Iterables

    为什么80%的码农都做不了架构师?>>>    序 本文主要研究一下Elasticsearch的Iterables Iterables elasticsearch-7.0.1/ser ...

  5. 聊聊Elasticsearch RestClient的RequestLogger

    序 本文主要研究一下Elasticsearch RestClient的RequestLogger RequestLogger elasticsearch-7.0.1/client/rest/src/m ...

  6. 聊聊Elasticsearch的CachedSupplier

    序 本文主要研究一下Elasticsearch的CachedSupplier CachedSupplier elasticsearch-7.0.1/server/src/main/java/org/e ...

  7. 聊聊Elasticsearch的BootstrapCheck

    序 本文主要研究一下Elasticsearch的BootstrapCheck BootstrapCheck elasticsearch-7.0.1/server/src/main/java/org/e ...

  8. 聊聊Elasticsearch的NodesSniffer

    序 本文主要研究一下Elasticsearch的NodesSniffer NodesSniffer elasticsearch-7.0.1/client/sniffer/src/main/java/o ...

  9. 【ElasticSearch从入门到放弃系列 零】ElasticSearch看这一篇就够了

    大数据时代系统和业务每分每秒都产生成千上万的数据,其存储一定是不能通过关系型数据库了,当然因为数据的持久性也不能存储到内存型Nosql数据库Redis中,我们通常会将这些数据存储在能够不丢失数据的非关 ...

最新文章

  1. python期末考试编程题_Python_编程题期末必看
  2. win下修改mysql默认的字符集以防止乱码出现
  3. 八、“看夕阳西下,烂漫秋霞”
  4. python3列表推导式
  5. math标准库函数----python
  6. [vscode] markdown_index----可以为你的markdown标题添加序号的插件
  7. openSUSE 安装 Torch
  8. PHP重置static静态变量
  9. 小米路由器4刷机说明(openwrt-21.02.1)
  10. QT图形显示和处理5
  11. 双十一优惠算不清凑单太麻烦?苏宁“千人千面”帮你搞定
  12. 什么是MySQL数据空洞?
  13. 网易互娱2017实习生招聘在线笔试--源代码编译
  14. ransomware(假的勒索病毒)逆向分析
  15. 八图片在线图片设置付费
  16. centos通过nmcli设置静态ip及设置开机自动连接
  17. 简述什么是T-SQL
  18. C语言对于轴对称图形输出的分析
  19. html对称标记,html5/css3 字体 对称渐变+描边+影子
  20. 每日案例(第四期):智慧金融08-10 | 知识图谱实践案例集(速读版)

热门文章

  1. stm32 SDRAM配置
  2. 25_TFTLCD原理与指令
  3. CockroachDB架构——SQL层
  4. 如何在3ds max中创建可用于真人场景的巨型机器人:第 1部分
  5. PostMessage Vue中使用
  6. 【先楫HPM6750测评】RT-Thread WiFi联网和SPI驱动
  7. Android 显示输入法中的emoji表情以及String字符串转码
  8. 变量的命名规则十二条
  9. 安卓四核PDA手持PDA智能POS机 打印二维码 分享
  10. 成都玖益科技:零基础商品怎么推广