实例讲解spring boot 多线程

  Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor。而实际开发中任务一般是非阻塞的,即异步的,所有我们在配置类中通过@EnableAsync开启对异步任务的支持,并通过在实际执行的Bean的方法中使用@Async注解来声明其是一个异步任务。

一、配置类

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;

}

}

1、利用@EnableAsync注解开启异步任务支持

2、配置类实现AsyncConfigurer接口并重写getAsyncExecutor方法,并返回一个ThreadPoolTaskExecutor,这样我们就获得了一个基于线程池TaskExecutor。

二、任务执行类

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。

  如果在异步方法所在类中调用异步方法,将会失效;

三、运行

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();

}

}

运行结果:

异步执行任务: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 实战》。

以上是 实例讲解spring boot 多线程 的全部内容, 来源链接: utcz.com/z/349314.html

回到顶部