spring boot-高階話題之 多執行緒、@EnableScheduling開啟計劃任務的支援(2)
spring通過任務執行器(TaskExecutor)來實現多執行緒和併發程式設計。
ThreadPoolTaskExecutor可實現一個基於執行緒池的TaskExecutor。
實際開發中任務一般是非阻礙的,即非同步的,通過@EnableAsync開啟對非同步任務的支援,
並通過實際執行的Bean的方法中使用@Async註解來宣告其是一個非同步任務。
[email protected] //1標識是是非同步方法
[email protected] // 1開啟非同步任務支援package com.zh.ch3.taskexecutor; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; @Service public class AsyncTaskService { @Async //1標識是是非同步方法 public void executeAsyncTask(Integer i){ System.out.println("執行非同步任務: "+i); } @Async public void executeAsyncTaskPlus(Integer i){ System.out.println("執行非同步任務:+1: "+(i+1)); } }
3.測試類package com.zh.ch3.taskexecutor; import java.util.concurrent.Executor; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration @ComponentScan("com.zh.ch3.taskexecutor") @EnableAsync // 1開啟非同步任務支援 public class TaskExecutorConfig implements AsyncConfigurer {// 2配置AsyncConfigurer並重寫getAsyncExecutor @Override public Executor getAsyncExecutor() {// 2 ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); taskExecutor.setMaxPoolSize(10); taskExecutor.setQueueCapacity(25); taskExecutor.initialize(); return taskExecutor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; } }
測試結果:(單純的非同步載入,並未設計到鎖機制)package com.zh.ch3.taskexecutor; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class); AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class); for (int i = 0; i < 10; i++) { asyncTaskService.executeAsyncTask(i); asyncTaskService.executeAsyncTaskPlus(i); } context.close(); } }
執行非同步任務: 3
執行非同步任務: 1
執行非同步任務: 4
執行非同步任務:+1: 1
執行非同步任務: 5
執行非同步任務:+1: 6
執行非同步任務: 6
執行非同步任務:+1: 7
執行非同步任務: 7
執行非同步任務:+1: 8
=======================================================================
@EnableScheduling開啟計劃任務
1.
[email protected]:宣告該方法是一個計劃任務,fixedRate屬性設定每隔固定時間執行
2cron屬性:按照指定時間執行(11時28)cron事unix和類unix(linux)系統下的定時時間
package com.zh.ch3.taskscheduler;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
public class ScheduledTaskService {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000) // [email protected]:宣告該方法是一個計劃任務,fixedRate屬性設定每隔固定時間執行
public void reportCurrentTime() {
System.out.println("每隔5秒執行一次: " + dateFormat.format(new Date()));
}
@Scheduled(cron = "0 28 11 ? * *") // 2cron屬性:按照指定時間執行(11時28)cron事unix和類unix(linux)系統下的定時時間
public void fixTimeExecution() {
System.out.println("在指定時間內執行一次: " + dateFormat.format(new Date()) + "執行");
}
}
[email protected] //[email protected]:開啟計劃任務的支援package com.zh.ch3.taskscheduler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
@Configuration
@ComponentScan("com.zh.ch3.taskscheduler")
@EnableScheduling //[email protected]:開啟計劃任務的支援
public class TaskSchedulerConfig {
}
測試
package com.zh.ch3.taskscheduler;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskSchedulerConfig.class);
}
}
結果:每隔5秒執行一次: 17:02:27(每5秒執行一次)
相關推薦
spring boot-高階話題之 多執行緒、@EnableScheduling開啟計劃任務的支援(2)
spring通過任務執行器(TaskExecutor)來實現多執行緒和併發程式設計。 ThreadPoolTaskExecutor可實現一個基於執行緒池的TaskExecutor。 實際開發中任務一般是非阻礙的,即非同步的,通過@EnableAsync開啟對非同步任務的支援
PHP 高階程式設計之多執行緒-訊息佇列
1. 多執行緒環境安裝 1.1. PHP 5.5.9 安裝PHP 5.5.9 https://github.com/oscm/shell/blob/master/php/5.5.9.sh ./configure --prefix=/srv/php-5.5.9 \ --wi
Spring-Boot中如何使用多執行緒處理任務
看到這個標題,相信不少人會感到疑惑,回憶你們自己的場景會發現,在Spring的專案中很少有使用多執行緒處理任務的,沒錯,大多數時候我們都是使用Spring MVC開發的web專案,預設的Controller,Service,Dao元件的作用域都是單例項,無狀態,然後被併發
java高階特性之多執行緒
java多執行緒知識點: 1、建立分執行緒的方式 2、單例模式懶漢式執行緒安全問題 3、java執行緒同步 4、java執行緒通訊 5、java的記憶體模型 認識執行緒: 每一個java程式都有一個隱含的主執行緒,即main()方法。 程式–&g
Spring-boot使用Quartz實現多執行緒排程任務
背景:專案的背景還原一下,專案的App需要去呼叫第三方的介面獲取資料。我們要建立很多個任務(Task),每個Task都要去獲取資料,但是每個Task的執行週期和頻率不一樣。所以使用多執行緒來解決。為每一個Task啟動一個執行緒。然後迴圈不停的去獲取資料。剛開始的時候打算自
Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊
Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python多執行緒 對於I/O操作的時候,程序與執行緒的效能差別不大,甚至由於執行緒更輕量級,效能更高
Java學習之多執行緒、內部類
內部類: 定義在類中的類,成為內部類。 好處是可以直接訪問外部類中的成員(包括私有)。 外部類想訪問內部類需要建立內部類物件。 匿名內部類:就是內部類的簡化格式。 內部類必須繼承一個類或者實現介面,這種情況下的內部類可以簡化成匿名內部類。
Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊
一、python多執行緒 對於I/O操作的時候,程序與執行緒的效能差別不大,甚至由於執行緒更輕量級,效能更高。這裡的I/O包括網路I/O和檔案I/O 1、例項 假如利用socket傳送http請求,也就是網路I/O。爬取列表網頁中的寫href連結,然後獲取href連結之後,在爬去連結的網頁詳情。 如果不適用
Java之多執行緒、執行緒池
多執行緒 執行緒:執行緒是程序中的一個執行單元,負責當前程序中程式的執行,一個程序中至少一個執行緒(main),但是可以有多個執行緒的,則這個程式稱為多執行緒程式。每一個執行緒執行不同的任務,多執行緒程式並不能提高程式的執行速度,可以提高程式的執行效率。 CPU處理可以分為
python爬蟲之多執行緒、多程序+程式碼示例
#python爬蟲之多執行緒、多程序 >使用多程序、多執行緒編寫爬蟲的程式碼能有效的提高爬蟲爬取目標網站的效率。 ## 一、什麼是程序和執行緒 引用[廖雪峰的官方網站](https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376)
Spring 之多執行緒
Spring 通過任務執行器 TaskExecutor 來實現多執行緒和併發程式設計, 使用 ThreaPoolTaskExector 可實現一個基於執行緒池的 TaskExecutor. 而實際開發任務一般非阻礙的,即非同步.所以我們要在配置
(十二)boost庫之多執行緒高階特性
很多時候,執行緒不僅僅是執行一些耗時操作,可能我們還需要得到執行緒的返回值,一般的處理方法就是定義一個全域性狀態變數,不斷輪訓狀態,就如我目前維護的一個專案,全域性變數定義了N中狀態,看的讓人抓狂。該專案的大體邏輯是這樣的,啟動K個執行緒,當執行緒執行到某一個點時,進行輪
Python爬蟲之多執行緒,多程序
前言 我們之前寫的爬蟲都是單個執行緒的?這怎麼夠?一旦一個地方卡到不動了,那不就永遠等待下去了?為此我們可以使用多執行緒或者多程序來處理。 首先宣告一點! 多執行緒和多程序是不一樣的!一個是 thread 庫,一個是 multiprocessing 庫。而多執行緒 thread 在 Pytho
java面試/筆試題目之多執行緒及鎖 (持續更新中)
前言:這一模組可以參照徐劉根大佬的部落格。 一.執行緒和程序的概念、並行和併發的概念 1.程序:是計算機中的程式關於某資料集合上的一次執行活動,是系統 進行資源分配和排程的基本單位,是作業系統結構的基礎。程式是指令、資料及其組織形式的描述,程序是程式的實體。 2.執行緒:是程式執行流的
併發程式設計之多執行緒執行緒安全
什麼是執行緒安全? 為什麼有執行緒安全問題? 當多個執行緒同時共享,同一個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。 案例: 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。 p
併發程式設計之多執行緒基礎
執行緒與程序區別 每個正在系統上執行的程式都是一個程序。每個程序包含一到多個執行緒。執行緒是一組指令的集合,或者是程式的特殊段,它可以在程式裡獨立執行。也可以把它理解為程式碼執行的上下文。所以執行緒基本上是輕量級的程序,它負責在單個程式裡執行多工。通常由作業系統負責多個執行緒的排程和執行。
2018-08-28微服務筆記(一)之多執行緒
1.多執行緒 1.1 程序與執行緒 (1)程序:正在執行的程式,是執行緒的集合。主執行緒決定程式碼的執行順序。 (2)執行緒:正在獨立執行的一條執行路徑。 (3)多執行緒:為了提高程式的效率。 1.2 四種方式建立執行緒 (1)繼承Thread類 (2)實現Runnable介面
.NET基礎之多執行緒開發基礎
轉自:http://www.cnblogs.com/edisonchou/p/4848131.html 多執行緒開發基礎 Index : (1)型別語法、記憶體管理和垃圾回收基礎 (2)面向物件的實現和異常的處理基礎
面試題之——多執行緒併發面試題
1) 什麼是執行緒? 執行緒是作業系統能夠進行運算排程的最小單位,它被包含在程序之中,是程序中的實際運作單位。程式設計師可以通過它進行多處理器程式設計,你可以使用多執行緒對運算密集型任務提速。比如,如果一個執行緒完成一個任務要100毫秒,那麼用十個執行緒完成改任務只需10毫秒。Java在語言層面對多執行
面試題之——多執行緒詳解
多執行緒作為Java中很重要的一個知識點,在此還是有必要總結一下的。 一.執行緒的生命週期及五種基本狀態 關於Java中執行緒的生命週期,首先看一下下面這張較為經典的圖: 上圖中基本上囊括了Java中多執行緒各重要知識點。掌握了上圖中的各知識點,Java中的多執行緒也就基本上掌握了。主