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    : 异步结束了。。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值