}
}
} finally {
phaser.arriveAndDeregister(); //deregister
if (statistics) {
if (ReturnResult.SUCCESS.equals(result)) {
counter.incrSuccess(batch);
} else if (ReturnResult.FAIL.equals(result)) {
counter.incrFail(batch);
} else if (ReturnResult.FILTER.equals(result)) {
counter.incrFilter(batch);
}
}
}
}
//等待结果
public ExecuteResult awaitResult() {
phaser.arriveAndAwaitAdvance();
return getExecuteResult();
}
使用就非常简单了
ExecuteInstance ei = ExecuteInstance.buildWithPhaser(myExecutor); //线程池
//循环
LoopShutdown.build("myTask").loop(() -> {
//不断从数据获取数据
List<Task> list = getFromDb();
list.forEach(item -> ei.execute(() -> {
//提交到线程池执行,并且统计
}));
});
return ei.awaitResult();
总结
Phaser是jkd7后提供的同步工具类,它底层并没有使用AQS同步工具。相比CountDownLatch等它提供了更丰富的功能,但也意味着它更复杂,需要更多的资源,一些简单的场景CountDownLatch等工具类能满足的就使用它们即可,考虑性能,还有灵活性时才考虑使用Phaser,如笔者的场景使用Phaser就更加适合。
更多分享,欢迎关注我的github:https://github.com/jmilktea/jtea