聊聊Elasticsearch的RunOnce
序
本文主要研究一下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相关推荐
- 聊聊Elasticsearch的ExponentiallyWeightedMovingAverage
序 本文主要研究一下Elasticsearch的ExponentiallyWeightedMovingAverage ExponentiallyWeightedMovingAverage elasti ...
- 聊聊elasticsearch的RoutingService
为什么80%的码农都做不了架构师?>>> 序 本文主要研究一下elasticsearch的RoutingService RoutingService elasticsearch ...
- 聊聊Elasticsearch的TimedRunnable
序 本文主要研究一下Elasticsearch的TimedRunnable TimedRunnable elasticsearch-7.0.1/server/src/main/java/org/ela ...
- 聊聊Elasticsearch的Iterables
为什么80%的码农都做不了架构师?>>> 序 本文主要研究一下Elasticsearch的Iterables Iterables elasticsearch-7.0.1/ser ...
- 聊聊Elasticsearch RestClient的RequestLogger
序 本文主要研究一下Elasticsearch RestClient的RequestLogger RequestLogger elasticsearch-7.0.1/client/rest/src/m ...
- 聊聊Elasticsearch的CachedSupplier
序 本文主要研究一下Elasticsearch的CachedSupplier CachedSupplier elasticsearch-7.0.1/server/src/main/java/org/e ...
- 聊聊Elasticsearch的BootstrapCheck
序 本文主要研究一下Elasticsearch的BootstrapCheck BootstrapCheck elasticsearch-7.0.1/server/src/main/java/org/e ...
- 聊聊Elasticsearch的NodesSniffer
序 本文主要研究一下Elasticsearch的NodesSniffer NodesSniffer elasticsearch-7.0.1/client/sniffer/src/main/java/o ...
- 【ElasticSearch从入门到放弃系列 零】ElasticSearch看这一篇就够了
大数据时代系统和业务每分每秒都产生成千上万的数据,其存储一定是不能通过关系型数据库了,当然因为数据的持久性也不能存储到内存型Nosql数据库Redis中,我们通常会将这些数据存储在能够不丢失数据的非关 ...
最新文章
- python期末考试编程题_Python_编程题期末必看
- win下修改mysql默认的字符集以防止乱码出现
- 八、“看夕阳西下,烂漫秋霞”
- python3列表推导式
- math标准库函数----python
- [vscode] markdown_index----可以为你的markdown标题添加序号的插件
- openSUSE 安装 Torch
- PHP重置static静态变量
- 小米路由器4刷机说明(openwrt-21.02.1)
- QT图形显示和处理5
- 双十一优惠算不清凑单太麻烦?苏宁“千人千面”帮你搞定
- 什么是MySQL数据空洞?
- 网易互娱2017实习生招聘在线笔试--源代码编译
- ransomware(假的勒索病毒)逆向分析
- 八图片在线图片设置付费
- centos通过nmcli设置静态ip及设置开机自动连接
- 简述什么是T-SQL
- C语言对于轴对称图形输出的分析
- html对称标记,html5/css3 字体 对称渐变+描边+影子
- 每日案例(第四期):智慧金融08-10 | 知识图谱实践案例集(速读版)