1. 程式人生 > 其它 >關於非同步任務,多執行緒@EnableAsync@Async

關於非同步任務,多執行緒@EnableAsync@Async

技術標籤:Spring

spring中有十分優秀的支援,就是註解@EnableAsync就可以使用多執行緒,@Async加線上程任務的方法上(需要非同步執行的任務),定義一個執行緒任務,通過spring提供的ThreadPoolTaskExecutor就可以使用執行緒池

首先定義配置類

這個配置類需要實現AsyncConfiguer介面,並實現它的方法

  • 非同步執行緒的執行者,在裡面配置自動執行的東西,比如執行緒池引數
  • 執行緒異常處理
package ds.watsons.app.label.config;
import java.util.concurrent.Executor;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configurable
@EnableAsync
public class TreadPoolConfigTest implements AsyncConfigurer{

    @Override
    public Executor getAsyncExecutor() {
        // TODO Auto-generated method stub
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心執行緒池數量,方法: 返回可用處理器的Java虛擬機器的數量。
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        //最大執行緒數量
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors()*5);
        //執行緒池的佇列容量
        executor.setQueueCapacity(Runtime.getRuntime().availableProcessors()*2);
        //執行緒名稱的字首
        executor.setThreadNamePrefix("this-excutor-");
        // setRejectedExecutionHandler:當pool已經達到max size的時候,如何處理新任務
        // CallerRunsPolicy:不在新執行緒中執行任務,而是由呼叫者所在的執行緒來執行
        //executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }
    /*非同步任務中異常處理*/
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        // TODO Auto-generated method stub
        return new SimpleAsyncUncaughtExceptionHandler();
    }       
}
  • 執行緒任務類
package ds.watsons.app.label.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class TreadTasks {
    @Async
    public void startMyTreadTask() {
        System.out.println("this is my async task");
    }
}
  • 呼叫非同步執行緒任務
package ds.watsons.app.label.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import ds.watsons.app.label.service.TreadTasks;

@Controller
public class AsyncTaskUse {
    @Autowired
    private TreadTasks treadTasks;
    @GetMapping("/startMysync")
    public void useMySyncTask() {
        treadTasks.startMyTreadTask();
    }
}

請求url

/startMysync

返回結果:

this is my async task