SpingBoot —— 多線程

  Spring 經過任務執行器(TaskExecutor)來實現多線程和併發編程。使用ThreadPoolTaskExecutor可實現一個基於線程池的TaskExecutor。而實際開發中任務通常是非阻塞的,即異步的,全部咱們在配置類中經過@EnableAsync開啓對異步任務的支持,並經過在實際執行的Bean的方法中使用@Async註解來聲明其是一個異步任務。java

1、配置類spring

package com.cenobitor.taskxecutor.config;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {

    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(25);
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

一、利用@EnableAsync註解開啓異步任務支持編程

二、配置類實現AsyncConfigurer接口並重寫getAsyncExecutor方法,並返回一個ThreadPoolTaskExecutor,這樣咱們就得到了一個基於線程池TaskExecutor。多線程

2、任務執行類併發

package com.cenobitor.taskxecutor.taskservice;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncTaskService {

    @Async
    public void excuteAsyncTask(Integer i){
        System.out.println("異步執行任務:"+i);
    }

    @Async
    public void excuteAsyncTaskPlus(Integer i){
        System.out.println("異步執行任務+1:"+(i+1));
    }
}

  經過@Async註解代表該方法是異步方法,若是註解在類級別,則代表該類全部的方法都是異步方法,而這裏的方法自動被注入使用ThreadPoolTaskExecutor做爲TaskExecutor。異步

  若是在異步方法所在類中調用異步方法,將會失效;async

3、運行ide

package com.cenobitor.taskxecutor;

import com.cenobitor.taskxecutor.taskservice.AsyncTaskService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskxecutorApplication.class);
        AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
        for (int i = 0; i < 10; i++) {
            asyncTaskService.excuteAsyncTask(i);
            asyncTaskService.excuteAsyncTaskPlus(i);
        }
        context.close();
    }

}

運行結果:spa

異步執行任務:0
異步執行任務+1:1
異步執行任務:1
異步執行任務+1:2
異步執行任務:2
異步執行任務:3
異步執行任務:5
異步執行任務+1:6
異步執行任務:6
異步執行任務+1:7
異步執行任務:7
異步執行任務+1:8
異步執行任務:8
異步執行任務+1:9
異步執行任務:9
異步執行任務+1:10
異步執行任務+1:3
異步執行任務:4
異步執行任務+1:5
異步執行任務+1:4線程

  注:摘抄自《JavaEE開發的顛覆者SpringBoot 實戰》。

相關文章
相關標籤/搜索