1. 程式人生 > >spring boot-高階話題之 多執行緒、@EnableScheduling開啟計劃任務的支援(2)

spring boot-高階話題之 多執行緒、@EnableScheduling開啟計劃任務的支援(2)

spring通過任務執行器(TaskExecutor)來實現多執行緒和併發程式設計。
ThreadPoolTaskExecutor可實現一個基於執行緒池的TaskExecutor。
實際開發中任務一般是非阻礙的,即非同步的,通過@EnableAsync開啟對非同步任務的支援,
並通過實際執行的Bean的方法中使用@Async註解來宣告其是一個非同步任務。

[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));
    }

}
[email protected] // 1開啟非同步任務支援
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;
	}

}
3.測試類
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中的多執行緒也就基本上掌握了。主