@Async搭配线程池使用

1.创建一个线程池

package com.pjk.config;
import com.sun.corba.se.spi.orbutil.threadpool.ThreadPool;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
//线程池配置类
@Configuration
@EnableAsync//开启spring对异步方法的支持
public class ThreadPoolConfig {
   @Bean(name = "taskExecutor")
   public Executor taskExecutor() {
       ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//创建线程池
       executor.setCorePoolSize(10);
       executor.setMaxPoolSize(20);
       executor.setQueueCapacity(30);//设定任务队列的个数
       executor.setThreadNamePrefix("taskExecutor");//设定线程池中的线程的名字前缀 线程名字将以此开头
       executor.initialize();
       return executor;
  }
}

2.创建一个异步方法类 在类中添加异步方法

package com.pjk.util;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
@Component
public class AsyncMethod {
   //测试异步方法
   @Async("taskExecutor")
   public CompletableFuture<Integer> sum(ArrayList<Integer> integers ) throws InterruptedException {
       CompletableFuture<Integer> completableFuture = new CompletableFuture<>();
       int sum=0;
       for (Integer integer : integers) {
           sum+=integer;
      }
       Thread.sleep(3000);
       System.out.println("计算结果为:"+sum);
       completableFuture.complete(sum);
       return  completableFuture;
  }
}

3.在你的类中 使用异步方法

package com.pjk;
import com.pjk.util.AsyncMethod;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.scheduling.annotation.EnableAsync;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
@EnableAsync
@SpringBootTest
public class ThreadPoolTest {
   @Resource
   private AsyncMethod asyncMethod;
   @Test
   void testAsync() throws InterruptedException, ExecutionException {
       ArrayList<Integer> integers = new ArrayList<>(1000000);
       for (int i = 0; i < 1000000; i++) {
           integers.add(i);
      }
       CompletableFuture<Integer> future = asyncMethod.sum(integers);
       future.thenAccept(result->{
           System.out.println("测试异步结果:"+result);
      });
       System.out.println("测试异步方法");
       Thread.sleep(5000);
       System.out.println("测试异步结果");
  }
}


0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP