Future的使用小记录
异步的作用
线程池的配置
- 注意两个注解:@Configuration@EnableAsync
package org.bibdr.aiplatform.config.pool;
import cn.hutool.core.thread.ThreadFactoryBuilder;
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;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Configuration
@EnableAsync
public class ThreadPoolConfig {
@Bean(name = "datasetThreadPoolExecutor")
public Executor datasetThreadPoolExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(30);
executor.setQueueCapacity(Integer.MAX_VALUE);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("复制数据集任务状态检测线程池");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}
}
异步服务编写
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
@Service
@Slf4j
public class LabelStudioTaskService {
@Async("datasetThreadPoolExecutor")
public Future<Map<String, Object>> test(Integer currentId, Integer labelStudioProjectId, Integer labeledNum, Integer taskNumber, Integer classification) {
log.info("异步进来了。。。。");
Map<String, Object> resultMap = new HashMap<>();
try {
Thread.sleep(1000*200);// 睡眠200秒
} catch (InterruptedException e) {
e.printStackTrace();
}
resultMap.put("oldLsProjectId", labelStudioProjectId);
resultMap.put("newLsProjectId", 2);
log.info("异步结束了。。。。");
return new AsyncResult<>(resultMap);
}
}
调用层 Controller
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Slf4j
@RestController
@RequestMapping("/t1")
@Api(tags = "调试接口,无实际功能")
public class Testcontroller {
@ApiOperation(value = "测试")
@GetMapping("/test")
public Object forkUpdate(@RequestParam("labelStudioProjectId") Integer labelStudioProjectId, @RequestParam("classification")Integer classification){
log.info("方法进来了。。。");
Future<Map<String, Object>> mapFuture = labelStudioTaskService.test(1, labelStudioProjectId, 1, 1, classification);
if (mapFuture.isDone()) {// 会执行到 但是没完成。一般会阻塞或者!mapFuture.isDone() 一直循环判断
try {
Map<String, Object> stringObjectMap = mapFuture.get();
Integer oldLsProjectId = (Integer) stringObjectMap.get("oldLsProjectId");
log.info("oldLsProjectId={}", oldLsProjectId);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
log.info("方法结束了。。。");
return "ok";
}
}
执行的结果
异步设置睡眠200秒。
线程池1:200秒之内完成了。
后续 顺序请求了12次。分别为线程池2、3……10、1
第11次请求,2022-10-26 18:56:35.559 由于前10个core满了 没有结束的进程,所以暂时等待,没开新线程
第12次请求,情况同11.
等线程池2执行完2022-10-26 18:58:45.977,等待的请求11进入该线程
等线程池3执行完2022-10-26 18:58:54.592,等待的请求12进入该线程
然后依次执行完毕。。
2022-10-26 18:41:52.819 INFO 4710 --- [nio-8060-exec-1] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:41:59.068 INFO 4710 --- [nio-8060-exec-1] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:41:59.072 INFO 4710 --- [复制数据集任务状态检测线程池1] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:45:19.141 INFO 4710 --- [复制数据集任务状态检测线程池1] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:55:22.419 INFO 4710 --- [nio-8060-exec-3] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:55:25.972 INFO 4710 --- [nio-8060-exec-3] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:55:25.972 INFO 4710 --- [复制数据集任务状态检测线程池2] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:55:30.193 INFO 4710 --- [nio-8060-exec-4] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:55:30.193 INFO 4710 --- [复制数据集任务状态检测线程池3] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:55:34.590 INFO 4710 --- [nio-8060-exec-4] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:55:41.800 INFO 4710 --- [nio-8060-exec-5] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:55:41.801 INFO 4710 --- [复制数据集任务状态检测线程池4] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:55:43.640 INFO 4710 --- [nio-8060-exec-5] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:04.981 INFO 4710 --- [nio-8060-exec-6] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:06.885 INFO 4710 --- [nio-8060-exec-6] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:06.885 INFO 4710 --- [复制数据集任务状态检测线程池5] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:08.164 INFO 4710 --- [nio-8060-exec-7] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:08.164 INFO 4710 --- [复制数据集任务状态检测线程池6] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:10.605 INFO 4710 --- [nio-8060-exec-7] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:12.244 INFO 4710 --- [nio-8060-exec-8] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:13.757 INFO 4710 --- [nio-8060-exec-8] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:13.757 INFO 4710 --- [复制数据集任务状态检测线程池7] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:16.136 INFO 4710 --- [nio-8060-exec-9] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:16.137 INFO 4710 --- [复制数据集任务状态检测线程池8] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:17.958 INFO 4710 --- [nio-8060-exec-9] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:20.125 INFO 4710 --- [io-8060-exec-10] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:21.790 INFO 4710 --- [io-8060-exec-10] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:21.790 INFO 4710 --- [复制数据集任务状态检测线程池9] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:25.279 INFO 4710 --- [nio-8060-exec-1] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:25.280 INFO 4710 --- [制数据集任务状态检测线程池10] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:27.981 INFO 4710 --- [nio-8060-exec-1] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:30.517 INFO 4710 --- [nio-8060-exec-2] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:30.517 INFO 4710 --- [复制数据集任务状态检测线程池1] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:56:33.493 INFO 4710 --- [nio-8060-exec-2] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:56:35.559 INFO 4710 --- [nio-8060-exec-3] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:56:57.477 INFO 4710 --- [nio-8060-exec-3] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:57:08.225 INFO 4710 --- [nio-8060-exec-4] o.b.aiplatform.facade.Testcontroller : 方法进来了。。。
2022-10-26 18:57:09.581 INFO 4710 --- [nio-8060-exec-4] o.b.aiplatform.facade.Testcontroller : 方法结束了。。。
2022-10-26 18:58:45.977 INFO 4710 --- [复制数据集任务状态检测线程池2] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:58:52.902 INFO 4710 --- [复制数据集任务状态检测线程池2] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:58:54.592 INFO 4710 --- [复制数据集任务状态检测线程池3] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:00.975 INFO 4710 --- [复制数据集任务状态检测线程池3] o.b.a.b.l.task.LabelStudioTaskService : 异步进来了。。。。
2022-10-26 18:59:03.644 INFO 4710 --- [复制数据集任务状态检测线程池4] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:26.890 INFO 4710 --- [复制数据集任务状态检测线程池5] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:30.608 INFO 4710 --- [复制数据集任务状态检测线程池6] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:33.759 INFO 4710 --- [复制数据集任务状态检测线程池7] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:37.963 INFO 4710 --- [复制数据集任务状态检测线程池8] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:41.794 INFO 4710 --- [复制数据集任务状态检测线程池9] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:47.984 INFO 4710 --- [制数据集任务状态检测线程池10] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 18:59:53.498 INFO 4710 --- [复制数据集任务状态检测线程池1] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 19:02:12.905 INFO 4710 --- [复制数据集任务状态检测线程池2] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。
2022-10-26 19:02:20.979 INFO 4710 --- [复制数据集任务状态检测线程池3] o.b.a.b.l.task.LabelStudioTaskService : 异步结束了。。。。