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 实战》。

相关文章
相关标签/搜索