SpringBoot實戰(一)——非同步呼叫Async
轉自:http://blog.csdn.net/v2sking/article/details/72795742
什麼是非同步呼叫?
非同步呼叫是相對於同步呼叫而言的,同步呼叫是指程式按預定順序一步步執行,每一步必須等到上一步執行完後才能執行,非同步呼叫則無需等待上一步程式執行完即可執行。
如何實現非同步呼叫?
多執行緒,這是很多人第一眼想到的關鍵詞,沒錯,多執行緒就是一種實現非同步呼叫的方式。
在非spring目專案中我們要實現非同步呼叫的就是使用多執行緒方式,可以自己實現Runable介面或者整合Thread類,或者使用jdk1.5以上提供了的Executors執行緒池。
StrngBoot中則提供了很方便的方式執行非同步呼叫。
按照官方示例開擼
程式碼入下
maven依賴:
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.5.3.RELEASE</version>
- </parent>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- </dependencies>
- @SpringBootApplication
- @EnableAsync
- publicclass Application{
- publicstaticvoid main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
- }
Controller
只需在需要非同步執行方法上新增@Async註解
- @RestController
- @RequestMapping("")
- publicclass AsyncTaskController {
- @RequestMapping("")
- public String doTask() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- this.task1();
- this.task2();
- this.task3();
- long currentTimeMillis1 = System.currentTimeMillis();
- return"task任務總耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms";
- }
- @Async
- publicvoid task1() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(1000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task1任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- }
- @Async
- publicvoid task2() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(2000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task2任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- }
- @Async
- publicvoid task3() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(3000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task3任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- }
- }
http://localhost:8080/
控制檯:
- task1任務耗時:1012ms
- task2任務耗時:2009ms
- task3任務耗時:3004ms
等了一段瀏覽器時候輸出入下:
- task任務總耗時:6002ms
非同步並沒有執行!
難道是程式碼寫錯了?反覆檢查了好幾遍,並沒有發現什麼明顯錯誤,想起spring對@Transactional註解時也有類似問題,spring掃描時具有@Transactional註解方法的類時,是生成一個代理類,由代理類去開啟關閉事務,而在同一個類中,方法呼叫是在類體內執行的,spring無法截獲這個方法呼叫。
豁然開朗,將非同步任務單獨放到一個類中,調整程式碼入下:
Controller
- @RequestMapping("")
- @RestController
- publicclass AsyncTaskController {
- @Autowired
- private AsyncTask asyncTask;
- @RequestMapping("")
- public String doTask() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- asyncTask.task1();
- asyncTask.task2();
- asyncTask.task3();
- long currentTimeMillis1 = System.currentTimeMillis();
- return"task任務總耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms";
- }
- }
- @Component
- publicclass AsyncTask {
- @Async
- publicvoid task1() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(1000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task1任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- }
- @Async
- publicvoid task2() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(2000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task2任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- }
- @Async
- publicvoid task3() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(3000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task3任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- }
- }
控制檯:
- task1任務耗時:1012ms
- task2任務耗時:2009ms
- task3任務耗時:3004ms
訪問瀏覽器結果入下:
- task任務總耗時:19ms
非同步呼叫成功!
如何知道三個非同步任務什麼時候執行完,執行的結果怎樣呢?可以採用新增Fature回撥方式判斷
程式碼入下:
非同步任務類
- @Component
- publicclass AsyncTask {
- @Async
- public Future<String> task1() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(1000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task1任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- returnnew AsyncResult<String>("task1執行完畢");
- }
- @Async
- public Future<String> task2() throws InterruptedException{
- long currentTimeMillis = System.currentTimeMillis();
- Thread.sleep(2000);
- long currentTimeMillis1 = System.currentTimeMillis();
- System.out.println("task2任務耗時:"+(currentTimeMillis1-currentTimeMillis)+"ms");
- returnnew AsyncResult<String>("task2執行完畢");
- }
- @Async
- public Future<String> task3() throws InterruptedException{
-
相關推薦
SpringBoot實戰(一)——非同步呼叫Async
轉自:http://blog.csdn.net/v2sking/article/details/72795742什麼是非同步呼叫?非同步呼叫是相對於同步呼叫而言的,同步呼叫是指程式按預定順序一步步執行,每一步必須等到上一步執行完後才能執行,非同步呼叫則無需等待上一步程式執行完
SpringBoot整合篇(二) 非同步呼叫Async
什麼是非同步呼叫? 非同步呼叫是相對於同步呼叫而言的,同步呼叫是指程式按預定順序一步步執行,每一步必須等到上一步執行完後才能執行,非同步呼叫則無需等待上一步程式執行完即可執行。 如何實現非同步呼叫? 多執行緒,這是很多人第一眼想到的關鍵詞,沒錯,多執行緒就是一種實現非同步
Springboot2(14)非同步呼叫Async
原始碼地址 非同步呼叫相對於同步呼叫而言,通常的方法都是程式按照順序來執行的,程式的每一步都需要等到上一步執行完成之後才能繼續往下執行;而非同步呼叫則無需等待,它可以在不阻塞主執行緒的情況下執行高耗時方法 文章目錄
多執行緒實戰(一)——多執行緒輪流呼叫
師傅留了一個作業讓我們來熟悉多執行緒問題,原本對多執行緒一直處於理論階段,大二學作業系統的時候寫的也是一知半解,今天拿到這道題又好好的做了一遍。 題目:稽核系統有一批工單需要處理,現在啟動三個執行緒進行處理,要求執行緒1處理工單id mod 3 = 1的工單,執行緒2處理工
Spring 事務配置實戰(一):過濾無需事務處理的查詢之類操作
log pla ssi pan spl tail gif aop img <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes
RabbitMq 實戰(一)
rabbitmq spring boot (消費者處理消息)RabbitMq消息消費者服務 開發工具Idea和Spring boot來開發的。消息消費目前只是一個簡單的Demo,後續會處理成更智能一些。首先配置文件類,RabbitMqConfig,裏面配置一些用戶名和密碼嗨喲隊列信息。package com.
Wicket實戰(一)概述
rac span 下載 本質 jsf xtend 公式 href tar 今天給大家介紹一個很好的東西。一個被稱作Java平臺上的ASP.NET——Wicket。 什麽是Wicket 什麽是Wicket,假設你用谷歌或其它
Linux系統集群架構線上項目配置實戰(一)
linux 項目 實戰 Linux系統集群架構線上項目配置實戰(一)本文出自 “民工哥博客” 博客,請務必保留此出處http://mingongge.blog.51cto.com/2429897/1971210Linux系統集群架構線上項目配置實戰(一)
機器學習實戰(一)—— 用線性回歸預測波士頓房價
-1 png 機器學習 mage 回歸 線性回歸 blog 分享 機器 機器學習實戰(一)—— 用線性回歸預測波士頓房價
全棧性能測試修煉寶典--Jmeter實戰(一)
div 測試用例 ceo 上下文切換 知識 能力 熱點 mongo rac 性能測試方向職業發展 1、軟件測試發展路線 我們可以暫且把軟件測試職業路線分為3個方向,分別是業務路線、技術路線、管理路線;4個象限,分別為執行層、中層、中高層過渡、高層。 (1)業務路線
mmall 項目實戰(一)項目初始化
ant log 初始 post gpo using base inno ole 1.創建 數據庫 及 表 數據腳本: /* Navicat Premium Data Transfer Source Server : 182.92.82.1
Docker從入門到實戰(一)
roc serve net lin 軟件 系統調用 生命 etc before 一步一步走,寫小白都能看懂的文章,將持續更新中,敬請期待! Docker從入門到實戰(一) 一:容器技術與Docker概念 1 什麽是容器 容器技術並不是一個全新的概念,它又稱為容器虛擬化。虛擬
MySQL數據庫從入門到實戰(一)
DBA體系 mysql 非關系型數據庫 SQL優化 第一部分:了解DBA體系一、初級DBA應該掌握哪些技能?(運維人員必會知識)1.MySQL安裝部署2.基本參數配置3.備份策略設計與實現 二、中級DBA應該掌握哪些技能?1.故障處理能力(備份或者其他手段)2.MySQL監控能力3.基本優化能
自動化運維工具Ansible實戰(一)簡介和部署
Ansible 自動化運維 一、Ansible的介紹 Ansible是新出現的自動化運維工具,基於Python開發,集合了眾多運維工具(puppet、cfengine、chef、func、fabric)的優點。實現了批量系統配置、批量程序部署、批量運行命令等功能。Ansible是基於模塊工作的,本身沒
Android項目實戰(一): SpannableString與SpannableStringBuilder
append() 同時 uil 註意 1.5 查看 strong 尊重 bject 原文:Android項目實戰(一): SpannableString與SpannableStringBuilder前言: 曾經在一些APP中的一些類似“幫助”&ld
Laravel 完整實戰(一) —— 搭建及配置
laravel composer 實戰 環境: nginx + php + mysql laravel : 5.5開發環境的搭建略過 安裝 laravel composer create-project laravel/laravel [project-name] --prefer-dist
Spark實戰(一)SparkStreaming集成Kafka
round 形式 寫入 some base cal 接下來 會話 支持 Spark Streaming + Kafka集成指南 Kafka項目在版本0.8和0.10之間引入了一個新的消費者API,因此有兩個獨立的相應Spark Streaming包可用。請選擇正確的包,
SpringBoot學習(一)——Spring的發展
spa java類 配置文件 實踐 項目 ice bsp 配置 學習 一、Spring1.x時代 在Spring1.x時代,都是通過xml文件配置bean,隨著項目的不斷擴大,需要將xml配置分放到不同的配置文件中,需要頻繁的在Java類和xml配置文件中切換。 二
Docker基礎入門實戰(一)
art The 開機自啟動 inf 應用程序 51cto 管理 x86 正在 Docker基礎入門實戰第1章 docker簡介1.1 what is DockerDocker是一個開源的應用容器引擎,基於Go語言並遵從Apache2.0協議開源,源代碼部
SpringBoot入門(一)——開箱即用
工程 新建 入門 專註 原則 無需 編寫 部署 sel 本文來自網易雲社區 Spring Boot是什麽 從根本上來講Spring Boot就是一些庫的集合,是一個基於“約定優於配置”的原則,快速搭建應用的框架。本質上依然Spring,在這之上幫我們省去了很多樣板化的配