当前位置:网站首页>guava多线程,futurecallback线程调用不平均
guava多线程,futurecallback线程调用不平均
2022-07-07 18:22:00 【zzhongcy】
最近查看日志,发现guava的多个futurecallback线程调用不平均,在这里记录一下
Guava Futures简介
Google Guava框架的 com.google.common.util.concurrent包是并发相关的包,它是对JDK自带
concurrent包中Future和线程池相关类的扩展,从而衍生出一些新类,并提供了更为广泛的功能。
在项目中常用的该包中类如下所示:
- ListenableFuture:该接口扩展了Future接口,增加了addListener方法,该方法在给定的excutor上注册一个监听器,当计算完成时会马上调用该监听器。不能够确保监听器执行的顺序,但可以在计算完成时确保马上被调用。
- FutureCallback:该接口提供了OnSuccess和onFailure方法。获取异步计算的结果并回调。
- MoreExecutors:该类是final类型的工具类,提供了很多静态方法。例如listeningDecorator方法初始化ListeningExecutorService方法,使用此实例submit方法即可初始化ListenableFuture对象。
- ListenableFutureTask:该类是一个适配器,可以将其它Future适配成ListenableFuture。
- ListeningExecutorService:该类是对ExecutorService的扩展,重写了ExecutorService类中的submit方法,并返回ListenableFuture对象。
- JdkFutureAdapters:该类扩展了FutureTask类并实现ListenableFuture接口,增加了addListener方法。
- Futures:该类提供和很多实用的静态方法以供使用。
现象
我创建了8个线程,平均处理多任务,但是到最后发现futurecallback调用的线程分部不平均。
日志:
2022-06-10 16:49:23.402 [pool-7-thread-7] INFO c.l.AsyncTask - percent=4%
2022-06-10 16:49:23.402 [pool-7-thread-7] INFO c.l.AsyncTask - percent=8%
2022-06-10 16:49:23.402 [pool-7-thread-7] INFO c.l.AsyncTask - percent=12%
2022-06-10 16:49:23.407 [pool-7-thread-7] INFO c.l.AsyncTask - percent=16%
2022-06-10 16:49:23.407 [pool-7-thread-7] INFO c.l.AsyncTask - percent=20%
2022-06-10 16:49:23.409 [pool-7-thread-7] INFO c.l.AsyncTask - percent=24%
2022-06-10 16:49:23.409 [pool-7-thread-7] INFO c.l.AsyncTask - percent=28%
2022-06-10 16:49:23.409 [pool-7-thread-7] INFO c.l.AsyncTask - percent=32%
2022-06-10 16:49:23.411 [pool-7-thread-7] INFO c.l.AsyncTask - percent=36%
2022-06-10 16:49:23.411 [pool-7-thread-7] INFO c.l.AsyncTask - percent=40%
2022-06-10 16:49:23.413 [pool-7-thread-7] INFO c.l.AsyncTask - percent=44%
2022-06-10 16:49:23.413 [pool-7-thread-7] INFO c.l.AsyncTask - percent=48%
2022-06-10 16:49:23.413 [pool-7-thread-7] INFO c.l.AsyncTask - percent=52%
2022-06-10 16:49:23.416 [pool-7-thread-7] INFO c.l.AsyncTask - percent=56%
2022-06-10 16:49:23.416 [pool-7-thread-7] INFO c.l.AsyncTask - percent=60%
2022-06-10 16:49:23.418 [pool-7-thread-7] INFO c.l.AsyncTask - percent=64%
2022-06-10 16:49:23.418 [pool-7-thread-7] INFO c.l.AsyncTask - percent=68%
2022-06-10 16:49:23.418 [pool-7-thread-7] INFO c.l.AsyncTask - percent=72%
2022-06-10 16:49:25.231 [pool-7-thread-8] INFO c.l.AsyncTask - percent=76%
2022-06-10 16:49:27.436 [pool-7-thread-2] INFO c.l.AsyncTask - percent=80%
2022-06-10 16:49:27.970 [pool-7-thread-4] INFO c.l.AsyncTask - percent=84%
2022-06-10 16:49:31.812 [pool-7-thread-5] INFO c.l.AsyncTask - percent=88%
2022-06-10 16:49:33.475 [pool-7-thread-6] INFO c.l.AsyncTask - percent=92%
2022-06-10 16:49:34.184 [pool-7-thread-3] INFO c.l.AsyncTask - percent=96%
2022-06-10 16:56:56.214 [pool-7-thread-1] INFO c.l.AsyncTask - percent=100%
参考例子:
ExecutorService executorService = Executors.newSingleThreadExecutor(new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r);
t.setDaemon(false);
return t;
}
});
ListenableFuture<?> listenableFuture = JdkFutureAdapters.listenInPoolThread(
executorService.submit(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("run!!!");
}
}),
executorService
);
Futures.addCallback(listenableFuture, new FutureCallback<Object>() {
@Override
public void onSuccess(@Nullable Object result) {
System.out.println("onSuccess");
}
@Override
public void onFailure(Throwable t) {
System.out.println("onFailure");
}
});
参考
Futures (Guava: Google Core Libraries for Java 23.0 API)
https://stackoverflow.com/questions/63629421/listenable-future-callback-is-heavily-delayed
边栏推荐
- 使用camunda做工作流设计,驳回操作
- 实战:sqlserver 2008 扩展事件-XML转换为标准的table格式[通俗易懂]
- 写了个 Markdown 命令行小工具,希望能提高园友们发文的效率!
- Mrs offline data analysis: process OBS data through Flink job
- [auto.js] automatic script
- Chapter 20 using work queue manager (3)
- ASP. Net learning & ASP's one word
- 取两个集合的交集
- Dachang classic pointer written test questions
- 机械臂速成小指南(十一):坐标系的标准命名
猜你喜欢
Dachang classic pointer written test questions
VMWare中虚拟机网络配置
测量楼的高度
I Basic concepts
机械臂速成小指南(十二):逆运动学分析
BI的边界:BI不适合做什么?主数据、MarTech?该如何扩展?
Implement secondary index with Gaussian redis
Airiot helps the urban pipe gallery project, and smart IOT guards the lifeline of the city
OneSpin 360 DV新版发布,刷新FPGA形式化验证功能体验
【哲思与实战】程序设计之道
随机推荐
第二十章 使用工作队列管理器(三)
力扣674. 最长连续递增序列
有用的win11小技巧
MIT science and technology review article: AgI hype around Gato and other models may make people ignore the really important issues
Deep learning model compression and acceleration technology (VII): mixed mode
EasyGBS级联时,上级平台重启导致推流失败、画面卡住该如何解决?
CodeSonar网络研讨会
School 1 of vulnhub
Force buckle 2315 Statistical asterisk
VMWare中虚拟机网络配置
Spark 判断DF为空
凌云出海记 | 赛盒&华为云:共助跨境电商行业可持续发展
力扣599. 两个列表的最小索引总和
Precautions for cjson memory leakage
Implement secondary index with Gaussian redis
Mongodb learn from simple to deep
MRS离线数据分析:通过Flink作业处理OBS数据
php 获取图片信息的方法
Nebula Importer 数据导入实践
Machine learning notes - explore object detection datasets using streamlit