栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot使用多线程-任务处理器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot使用多线程-任务处理器

1.第一步:初始化线程池,采用异步的配置,重写异步执行器

getAsyncExecutor()方法,初始化任务处理器线程池,ThreadPoolTaskExecutor;

线程池的配置:
几个关键部分:
(1)添加@Configuration 配置类的注解
(2)添加@ComponentScan 添加扫描的线程所在报道额位置
(3)添加@EnableAsync 开启异步
(4)重写getAsyncExecutor()方法,同时,初始化线程池,并返回

* 另外说明:此处@Configuration 注解的作用,
 
* 1、使配置类变成了full类型的配置类,spring在加载Appconfig的时候,Appconfig由普通类型转变为cglib代理类型 ,
 
* 2、在 @Bean method中使用,是单例的,不会创建对个对象

 

@Slf4j
@Configuration
@ComponentScan("com.qinzhy.mydemo.thread")
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {
    @Override
    public Executor getAsyncExecutor() {
        //初始化线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setQueueCapacity(25);
        taskExecutor.initialize();
        log.info("线程池初始化成功!!");
        return taskExecutor;
    }

    
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}
2.第二步:创建使用线程的服务类,并把它放到spring容器中,单例。
需要的线程的方法需要加异步的注解:  @Async
@Service
public class AsyncTaskService {
    @Async
    public void executeAsyncTask(Integer i){
        String name = Thread.currentThread().getName();
        System.out.println("当前线程"+name+"执行任务   "+i);
    }
    @Async
    public void executeAsyncTaskPlus(Integer i){
        String name = Thread.currentThread().getName();
        System.out.println("当前线程"+name+"执行任务   "+i);
    }
}

2.第二步:创建使用线程的服务类,并把它放到spring容器中,单例。

需要的线程的方法需要加异步的注解: @Async

@Service
public class AsyncTaskService {
    @Async
    public void executeAsyncTask(Integer i){
        String name = Thread.currentThread().getName();
        System.out.println("当前线程"+name+"执行任务   "+i);
    }
    @Async
    public void executeAsyncTaskPlus(Integer i){
        String name = Thread.currentThread().getName();
        System.out.println("当前线程"+name+"执行任务   "+i);
    }
}

3.第三步: 使用: 将任务加入到多线程的任务当中。(测试)

注入对象,调用对应的异步的方法,就会加入到多线程的任务队列中

@RequestMapping("/thread")
@ResponseBody
@Slf4j
@Controller
public class TestThreadController {
    @Autowired
    private AsyncTaskService asyncTaskService;

    @RequestMapping("/test")
    public String testThread(){

        for (int i = 0 ; i < 1000 ;i++){

            asyncTaskService.executeAsyncTask(i);
            asyncTaskService.executeAsyncTaskPlus(i);
        }
        return "success";
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755944.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号