实现异步转同步
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现异步转同步相关的知识,希望对你有一定的参考价值。
参考技术A 异步方法:调用方法,在方法中启动子线程
异步调用:启动子线程调用方法
异步转同步:由于同步简单易用,将异步方法进行封装,同步调用,等待结果
1个Lock、2个Condition(NotEmpty和NotFull)。入队结束后NotEmpty发出信号,出队结束后NotEmpty发出信号。
DefaultFuture.java
get(int timeout)方法和doReceived(Response res)方法,可以看到使用Lock和Condition
Lock中有一个volatile标示到state,在获取锁和释放锁都会对volatile变量读写
根据happen-before特性
线程1-doSomething>线程1-unlock
线程1-unlock时会写state>线程2-lock时会读state(volatile变量写先于读)
线程1-doSomething>线程2-lock(根据前2个和happen-before传递性)
通过传递性和volatile变量写先于读,保证加锁后操作可见
JS 同步转异步之Promise
同步方法在promise示例中变成异步执行:
console.log(1); let p = new Promise(resolve => { console.log(2); resolve(); console.log(3); }); console.log(4); p.then(() => { console.log(5); }); console.log(6);
输出:
由此,利用Promise实现同步转异步函数:
1 function syncTask() { // 同步任务函数 2 console.log(\'这是异步任务,没有按顺序执行\'); 3 return 4; 4 } 5 6 function createAsyncTask() { // 利用Promise创建异步任务 7 var p = new Promise(function (resolve) { 8 resolve(); 9 }); 10 return p; 11 } 12 13 createAsyncTask() 14 .then(syncTask) // 异步调用syncTask 15 .then(function (num) { // 获取syncTask函数返回值 16 console.log(num); 17 }); 18 19 console.log("我是用来陪衬的,虽然在后边,但是异步在我后边执行");
输出:
利用以上原理,封装一个同步转异步的函数:
1 // 把同步的任务转成异步任务 Promise.resolve(value)方法返回一个以给定值解析后的Promise 对象。在then中会执行传入的这个函数(参数syncTask2自定义可以修改) 2 function createAsyncTask(syncTask) { 3 return Promise.resolve(syncTask).then(syncTask2 => syncTask2()); 4 } 5 6 function syncTask() { // 同步任务函数 7 console.log(\'这是异步任务,没有按顺序执行\'); 8 return 4; 9 } 10 11 createAsyncTask(syncTask) // 将同步任务转为异步任务 12 .then(res => console.log(res));// 接收同步任务函数syncTask的返回值res 13 14 console.log("我是用来陪衬的,虽然在后边,但是异步在我后边执行");
输出:
备注:Promise.resolve的用法。
1 // 传递一个普通的值
2 let p1 = new Promise(resolve => {
3 resolve(\'成功1!\');
4 });
5
6 let p2 = Promise.resolve(\'成功2!\');
7
8 function printContent(params) {
9 console.log(params);
10 }
11 p1.then(printContent);
12 p2.then(printContent);
输出:
p1与p2相同,也就是说,两种生成Promise的方式是等价的。
结果都是生成一个已经决议为成功的Promise实例。
以上是关于实现异步转同步的主要内容,如果未能解决你的问题,请参考以下文章
java 异步查询转同步多种实现方式:循环等待,CountDownLatch,Spring Even
Day834.Dubbo如何用管程实现异步转同步 -Java 并发编程实战
Day834.Dubbo如何用管程实现异步转同步 -Java 并发编程实战