async

如何在项目中使用Spring异步调用注解@Async

五迷三道 提交于 2019-12-02 07:09:19
本文主要介绍如何使用Spring框架提供的异步调用注解@Async,异步线程池配置、异常捕获处理。 开启@Async注解支持 使用@Async注解的之前,必须在项目中启动时调用@EnableAsync注解。比如通过定义一个JavaConfig文件: @Configuration @EnableAsync public class AsyncConfig { } 异步调用 使用@Async异步执行无返回值的任务 定义一个任务类AsyncTask,包含两个执行耗时任务的方法task1()、task2(),在两个方法上添加@Async @Service @Slf4j public class AsyncTask { @Async public void task1() { log.info("task1 start"); } @Async public void task2() { log.info("task2 start"); } } 定义测试类,串行调用AsyncTask.task1()和AsyncTask.task2() @RunWith(SpringRunner.class) @SpringBootTest @Slf4j public class AsyncTaskTest { @Autowired private AsyncTask asyncTask; @Test

generator 到 async 的简单理解。

人盡茶涼 提交于 2019-12-02 07:07:55
generator 到 async 的简单理解。觉得实现方式很有意思。 1. generator generator 函数返回一个遍历器 每次调用next 方法 返回 有着value 和done 两个属性的对象 yield 后面的表达式即为 返回对象 value属性的值 举个简单例子: generator 函数返回一个遍历器 遍历器对象每执行一次next() 都只执行了generator 函数内部部分代码,遇到yield本次执行就结束了。 借助 工具 查看generator 经过转换后的代码,来了解一下generator 的大概实现 源码 1 function *gen() { 2 console.log('开始') 3 let a = yield '第一步' 4 console.log(a) 5 let b = yield '第二步' 6 console.log(b) 7 let c = yield '第三步' 8 console.log(c) 9 } 10 11 var it = gen() 12 console.log(it.next('')) 13 console.log(it.next()) 14 console.log(it.next()) 15 console.log(it.next()) 转换后的代码如图 查看babel, regenerator 的实现

iOS: 线程中那些常见的锁

拟墨画扇 提交于 2019-12-02 06:13:15
一、介绍 在多线程开发中,锁的使用基本必不可少,主要是为了解决资源共享时出现争夺而导致数据不一致的问题,也就是线程安全问题。锁的种类很多,在实际开发中,需要根据情况选择性的选取使用,毕竟使用锁也是消耗CPU的。 本人虽然一直有使用多线程进行开发,但是对于锁的使用和理解并不是特别的深入,这不看到一篇挺mark的博客: https://www.jianshu.com/p/a236130bf7a2 ,在此基础上稍添加点东西转载过来(尊重原创),一是为了记录便于随时翻阅,而是为了写一遍加深印象,知识都是一个copy和attract的过程。 二、种类 1、互斥锁 概念:对共享数据进行锁定,保证同一时刻只能有一个线程去操作。 抢到锁的线程先执行,没有抢到锁的线程就会被挂起等待。 等锁用完后需要释放,然后其它等待的线程再去抢这个锁,那个线程抢到就让那个线程再执行。 具体哪个线程抢到这个锁是由cpu调度决定的。 常用: @synchronized:同步代码块 example:执行操作 /** *设置属性值 */ -(void)setMyTestString:(NSString *)myTestString{ @synchronized(self) { // todo something _myTestString = myTestString; } } example:创建单例 //注意

Flutter 入门教程——Dart语言介绍

故事扮演 提交于 2019-12-02 05:55:11
目录 介绍 Dart vs Java 一、异步 1、Future 2、Async/await 3、Stream 二、变量声明 1、var 2、final和const 3、dynamic和Object 介绍 Dart 是谷歌开发的计算机编程语言 ,被用于web、服务器、移动端和物联网等领域的开发。Dart是面向对象的、类定义的、单继承的语言。语法类似C语言和JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing) 。 2011年10月10至12日Dart在丹麦奥尔胡斯举行的GOTO大会上亮相。由Lars bak和kasper lund创建。 2015年5月Dart开发者峰会上,亮相了基于Dart语言的移动应用程序开发框架 Sky ,后更名为 Flutter。 Dart vs Java 在VM性能层面,Dart VM在内存回收和吞吐量都进行了反复的优化,因此,Dart在Flutter中可以将GC做到10ms以内。毕竟Google在Go(没用VM但有GC)、JavaScript(v8)、Dalvik(Android上的Java VM)上已经有了很多技术积淀。Dart和Java相比,决胜因素并不会是在性能方面。 在语法层面

ES6知识点

℡╲_俬逩灬. 提交于 2019-12-02 03:54:41
ES6 var、let 及 const 区别? 全局申明的var变量会挂载在window上,而let和const不会 var声明变量存在变量提升,let和const不会 let、const 的作用范围是块级作用域,而var的作用范围是函数作用域 同一作用域下let和const不能声明同名变量,而var可以 同一作用域下在let和const声明前使用会存在暂时性死区 const 一旦声明必须赋值,不能使用null占位 声明后不能再修改 如果声明的是复合类型数据,可以修改其属性 Proxy Proxy 是 ES6 中新增的功能,它可以用来自定义对象中的操作。 Vue3.0 中将会通过 Proxy 来替换原本的 Object.defineProperty 来实现数据响应式。 let p = new Proxy(target, handler) target 代表需要添加代理的对象, handler 用来自定义对象中的操作,比如可以用来自定义 set 或者 get 函数。 let onWatch = (obj, setBind, getLogger) => { let handler = { set(target, property, value, receiver) { setBind(value, property) return Reflect.set(target,

JS基础-事件循环机制

[亡魂溺海] 提交于 2019-12-02 03:53:31
从一道题浅说 JavaScript 的事件循环 原文链接: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/7 注:本篇文章运行环境为当前最新版本的谷歌浏览器(72.0.3626.109) 任务队列 首先我们需要明白以下几件事情: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。 一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。 根据规范,事件循环是通过 任务队列 的机制来进行协调的。一个 Event Loop 中,可以有一个或者多个任务队列(task queue),一个任务队列便是一系列有序任务(task)的集合; 每个任务都有一个任务源(task source),源自同一个任务源的 task 必须放到同一个任务队列,从不同源来的则被添加到不同队列。 setTimeout/Promise 等API便是任务源,而进入任务队列的是他们指定的具体执行任务。 宏任务 (macro)task(又称之为宏任务),可以理解是每次执行栈执行的代码就是一个宏任务

详解JavaScript事件循环机制

好久不见. 提交于 2019-12-02 03:48:06
从一道题浅说 JavaScript 的事件循环 原文链接: https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/7 注:本篇文章运行环境为当前最新版本的谷歌浏览器(72.0.3626.109) 任务队列 首先我们需要明白以下几件事情: JS分为同步任务和异步任务 同步任务都在主线程上执行,形成一个执行栈 主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。 一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。 根据规范,事件循环是通过 任务队列 的机制来进行协调的。一个 Event Loop 中,可以有一个或者多个任务队列(task queue),一个任务队列便是一系列有序任务(task)的集合; 每个任务都有一个任务源(task source),源自同一个任务源的 task 必须放到同一个任务队列,从不同源来的则被添加到不同队列。 setTimeout/Promise 等API便是任务源,而进入任务队列的是他们指定的具体执行任务。 宏任务 (macro)task(又称之为宏任务),可以理解是每次执行栈执行的代码就是一个宏任务

ES6 async 函数

穿精又带淫゛_ 提交于 2019-12-02 03:37:26
async async 是 ES7 才有的与异步操作有关的关键字,和 Promise , Generator 有很大关联的。 语法 async function name([param[, param[, ... param]]]) { statements } name: 函数名称。 param: 要传递给函数的参数的名称。 statements: 函数体语句。 返回值 async 函数返回一个 Promise 对象,可以使用 then 方法添加回调函数。 async function helloAsync(){ return "helloAsync"; } console.log(helloAsync()) // Promise {<resolved>: "helloAsync"} helloAsync().then(v=>{ console.log(v); // helloAsync }) async 函数中可能会有 await 表达式,async 函数执行时,如果遇到 await 就会先暂停执行 ,等到触发的异步操作完成后,恢复 async 函数的执行并返回解析值。 await 关键字仅在 async function 中有效。如果在 async function 函数体外使用 await ,你只会得到一个语法错误。 function testAwait(){ return

ES7中的async 和 await

喜你入骨 提交于 2019-12-02 03:27:24
async 和 await 一个函数如果加上 async ,那么该函数就会返回一个 Promise async function test() { return "1" } console.log(test()) // -> Promise {<resolved>: "1"} async 就是将函数返回值使用 Promise.resolve() 包裹了下,和 then 中处理返回值一样,并且 await 只能配套 async 使用。 async function test() { let value = await sleep() } async 和 await 可以说是异步终极解决方案了,相比直接使用 Promise 来说,优势在于处理 then 的调用链,能够更清晰准确的写出代码,毕竟写一大堆 then 也很恶心,并且也能优雅地解决回调地狱问题。 当然也存在一些缺点,因为 await 将异步代码改造成了同步代码 ,如果多个异步代码没有依赖性却使用了 await 会导致性能上的降低。 async function test() { // 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式 // 如果有依赖性的话,其实就是解决回调地狱的例子了 await fetch(url) await fetch(url1) await fetch(url2) } 看一个使用

第26课 std::async异步任务

家住魔仙堡 提交于 2019-12-02 03:00:52
一. std::async函数模板 (一)std::async和std::thread的区别   1. 两者最明显的区别在于async采用默认启动策略时 并不一定创建新的线程 。如果系统资源紧张,那么 std::thread创建线程可能失败,系统报告异常,整个程序可能崩溃 。而std::async一般则不会,它会在无法创建新线程时,会 将异步任务分配给后续调用future.get()函数的线程,以同步的方式执行 (即不创建新线程)。   2. std::async 表现为更高阶的抽象, 它把用户从线程管理的细节解放出来 ,将这些责任转交给C++标准库的实现者。而 std::thread要求自行处理线程耗尽、超订、负载均衡以及新平台适配问题 。   3. std::thread 未提供直接获取线程函数返回值的方法 。但 std::async可以通过future对象来获取 。 (二)std::async函数模板及分析   1. “共享状态”对象 ,用于保存线程函数(一般是可调用对象)及其参数、返回值以及新线程状态等信息。该对象保存在堆中,由std::async、std::promise或std::package_task提供,并交由future或shared_future管理其生命期。被调方(通常指调用promise.set_value()的一方)将计算所得的结果写入“共享状态”