项目中线程池的应用

1、首先我们需要在配置类中将线程池作为单例bean配置

复制代码
@Configuration
public class ThreadPoolExecutorConfig {
    @Bean
    ExecutorService executorService(){
        return new ThreadPoolExecutor(
                2,
                3,
                0,
                TimeUnit.MICROSECONDS,
                new ArrayBlockingQueue<>(3),
                (r)->new Thread(r,"name"+System.currentTimeMillis()),
                new ThreadPoolExecutor.AbortPolicy()
        );
    }

}

2、 然后再对应的service中注入我们的ExecutorService

复制代码
package com.example.threaddemo.demos;

import com.example.threaddemo.mapper.TestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.*;
@Component
public class Test {


    @Autowired
    private ExecutorService executorService;
    @Autowired
    private TestMapper testMapper;


}

3、在方法中调用我们的线程池对象并且执行我们传入的任务

复制代码
package com.example.threaddemo.demos;

import com.example.threaddemo.mapper.TestMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.*;
@Component
public class Test {


    @Autowired
    private ExecutorService executorService;
    @Autowired
    private TestMapper testMapper;

    public void test() {
        Future<?> submit = executorService.submit(testMapper::Test1);
        System.out.println(submit.getClass());
    }


}


//下方是mapper文件,假设在操作数据库
package com.example.threaddemo.mapper;

import org.springframework.stereotype.Component;
@Component
public class TestMapper {
    public void Test1(){
        System.out.println("Test");
    }
}

4、简述执行流程

  1. 首先程序会构建线程池
  2. 当我们使用方法引用将上方指定的mapper中的方法传入线程池的submit方法中时,实际是传入到线程池中的Runnable的run方法,程序会根据我们的run方法进行执行
  3. 使用submit方法可以获取到返回值对象Future实例,通过Future实例可以调用get方法获取到我们所期待的返回值
  4. 但是此时这个submit是阻塞式的,他会阻塞调用它的线程直到get方法成功获取到返回值,此时可以考虑使用 execute 方法
相关推荐
毕设源码-钟学长1 分钟前
【开题答辩全过程】以 基于Java的医药进出口交易系统设计与实现为例,包含答辩的问题和答案
java·开发语言
Touch&2 分钟前
Windows11多个JDK版本(Java8、Java11、Java17、Java21)下载安装和切换
java·jdk·jdk多个版本切换
清水白石0086 分钟前
Python 性能优化全景解析:当 Big O 骗了你——深挖常数开销、内存与解释器黑盒
开发语言·python·性能优化
oi..9 分钟前
python Get/Post请求练习
开发语言·经验分享·笔记·python·程序人生·安全·网络安全
星夜夏空9911 分钟前
C语言进阶项目——搭建内存池
c语言·开发语言
帮我吧智能服务平台11 分钟前
装备制造企业售后服务数字化:从成本中心到利润中心背景
java·前端·制造
历程里程碑13 分钟前
Proto3 三大高级类型:Any、Oneof、Map 灵活解决复杂业务场景
java·大数据·开发语言·数据结构·elasticsearch·链表·搜索引擎
蜜獾云13 分钟前
DDD 架构分层,MQ消息要放到那一层处理?
java·jvm·架构
夫礼者16 分钟前
【极简监控】核弹级排障利器:仿 Jenkins Script Console 打造免重启诊断“黑科技”
java·jenkins·监控·排错
小杍随笔19 分钟前
【Rust Exercism 练习详解:Anagram + Space Age + Sublist(附完整代码与深度解读)】
开发语言·rust·c#