使用双异步后 如何保证数据一致性?
使用双异步后
小编为大家说一说使用双异步后的相关知识,下面小编为您详细解答
很简单,通过对比Excel文件行数和入库数量是否相等即可。
那么,如何获取异步线程的返回值呢?
一、通过Future获取异步返回值
我们可以通过给异步方法添加Future返回值的方式获取结果。
FutureTask 除了实现 Future 接口外,还实现了 Runnable 接口。
因此,FutureTask 可以交给 Executor 执行,也可以由调用线程直接执行FutureTask.run()。
1、FutureTask 是基于 AbstractQueuedSynchronizer实现的
AbstractQueuedSynchronizer简称AQS,它是一个同步框架,它提供通用机制来原子性管理同步状态、阻塞和唤醒线程,以及 维护被阻塞线程的队列。基于 AQS 实现的同步器包括:ReentrantLock、Semaphore、ReentrantReadWriteLock、 CountDownLatch 和 FutureTask。
基于 AQS实现的同步器包含两种操作:
- acquire,阻塞调用线程,直到AQS的状态允许这个线程继续执行,在FutureTask中,get()就是这个方法;
- release,改变AQS的状态,使state变为非阻塞状态,在FutureTask中,可以通过run()和cancel()实现。
2、FutureTask执行流程

- 执行@Async异步方法;
- 建立新线程async-executor-X,执行Runnable的run()方法,(FutureTask实现RunnableFuture,RunnableFuture实现Runnable);
- 判断状态state;
- 如果未新建或者不处于AQS,直接返回;
- 否则进入COMPLETING状态,执行异步线程代码;
- 如果执行cancel()方法改变AQS的状态时,会唤醒AQS等待队列中的第一个线程线程async-executor-1;
- 线程async-executor-1被唤醒后
- 将自己从AQS队列中移除;
- 然后唤醒next线程async-executor-2;
- 改变线程async-executor-1的state;
- 等待get()线程取值。
- next等待线程被唤醒后,循环线程async-executor-1的步骤
- 被唤醒
- 从AQS队列中移除
- 唤醒next线程
- 改变异步线程状态
- 新建线程async-executor-N,监听异步方法的state
- 如果处于EXCEPTIONAL以上状态,抛出异常;
- 如果处于COMPLETING状态,加入AQS队列等待;
- 如果处于NORMAL状态,返回结果;
3、get()方法执行流程
get()方法通过判断状态state观测异步线程是否已结束,如果结束直接将结果返回,否则会将等待节点扔进等待队列自旋,阻塞住线程。
自旋直至异步线程执行完毕,获取另一边的线程计算出结果或取消后,将等待队列里的所有节点依次唤醒并移除队列。
相关阅读
-
企业网站建设要多少钱 建企业网站需要的费用
小编为大家说一说企业网站建设要多少钱和建企业网站需要的费用的电脑小知识,具体详情如下: 搭建一个企业网站需要多少钱? 其实现在搭建企业网站比较透明了,你如果用模板搭建的话,
-
dns服务器不可用是什么原因 网络dns异常修复技巧
小编为网友们解答dns服务器不可用是什么原因和网络dns异常修复技巧的电脑小知识,接下来IT袋小编为大家介绍。 我们在使用电脑的时候经常会遇到各种各样的网络问题,例如最近就有Win11电脑
-
gdb怎么调试的?打断点用什么指令?
一个电脑小知识,为大家介绍gdb怎么调试的的内容,下面为详细的介绍。 编译时添加调试信息:在编译程序时,需要使用-g选项,以便将调试信息嵌入可执行文件中。例如: g++ -g -o my_program
-
创建一个自己的网站怎么弄 网页设计与网站建设教程
小编为你解答创建一个自己的网站怎么弄和网页设计与网站建设教程的IT小经验,具体详情如下: 前言: 现在很多人都拥有自己的网站,IT袋网小编在业余时间也搭建了一个自己的个人博客网


