• Spring 与 JDK 线程池的简单使用


    1.配置自定义共享线程池(Spring线程池)

    1. @Configuration
    2. @EnableAsync
    3. public class ThreadPoolConfig{
    4. //主要任务的调度,计划执行
    5. @Bean("taskScheduler")
    6. public Executor createScheduler(){
    7. // 创建一个线程池对象
    8. ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    9. // 定义一个线程池大小
    10. scheduler.setPoolSize(100);
    11. // 线程池名的前缀
    12. scheduler.setThreadNamePrefix("taskScheduler-");
    13. // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
    14. scheduler.setWaitForTasksToCompleteOnShutdown(true);
    15. // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
    16. scheduler.setAwaitTerminationSeconds(60);
    17. // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
    18. scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    19. return scheduler;
    20. }
    21. //主要任务的执行
    22. @Bean("taskExecutor")
    23. public Executor createExecutor(){
    24. // 创建一个线程池对象
    25. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    26. //核心线程池大小
    27. executor.setCorePoolSize(10);
    28. //最大线程数
    29. executor.setMaxPoolSize(30);
    30. //队列容量
    31. executor.setQueueCapacity(100);
    32. //活跃时间
    33. executor.setKeepAliveSeconds(60);
    34. //线程名字前缀
    35. executor.setThreadNamePrefix("taskExecutor-");
    36. // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
    37. executor.setWaitForTasksToCompleteOnShutdown(true);
    38. // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
    39. executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    40. return executor;
    41. }
    42. }

    2.编写执行任务对象与具体任务逻辑方法

    1. @Component
    2. public class TaskComponent{
    3. @Async("taskExecutor")
    4. public void doTaskExecutor() {
    5. System.out.println("任务开始执行!!!");
    6. //具体的执行任务
    7. //。。。。。。。
    8. }
    9. // //有返回值(ObjectVo为自己定义的返回类型)
    10. //@Async("taskExecutor")
    11. //public Future<ObjectVo> doTaskExecutor() {
    12. // System.out.println("任务开始执行!!!");
    13. // //具体的执行任务
    14. // //。。。。。。。
    15. // ObjectVo result=new ObjectVo();
    16. // return new AsyncResult<>(result);
    17. //}
    18. @Async("taskScheduler")
    19. public void doTaskScheduler() {
    20. System.out.println("任务开始调度!!!");
    21. //具体的调度任务
    22. //。。。。。。。
    23. }
    24. // //有返回值(ObjectVo为自己定义的返回类型)
    25. //@Async("taskScheduler")
    26. //public Future<ObjectVo> doTaskScheduler() {
    27. // System.out.println("任务开始调度!!!");
    28. // //具体的调度任务
    29. // //。。。。。。。
    30. // ObjectVo result=new ObjectVo();
    31. // return new AsyncResult<>(result);
    32. //}
    33. }

    3.调用任务方法(在哪调用都可以,根据自己业务需求在合适的地方调用即可)

    1. @Service
    2. public class UserServiceImpl implements UserService{
    3. @Autowired
    4. private TaskComponent taskComponent;
    5. //测试任务执行与调用
    6. @SneakyThrows
    7. @Override
    8. public void testTask(){
    9. //没有返回值
    10. taskComponent.doTaskExecutor();
    11. taskComponent.doTaskScheduler();
    12. //有返回值
    13. //Future<ObjectVo> executorResult = taskComponent.doTaskExecutor();
    14. //Future<ObjectVo> schedulerResult = taskComponent.doTaskScheduler();
    15. //System.out.println(executorResult.get());
    16. //System.out.println(schedulerResult.get());
    17. }
    18. }

    ===============Executors结构========jdk自带线程池==========

    1.任务(Runnable,Callable)
    2.任务的执行(Executor,ExecutorService 接口,ThreadPoolExecutor,ScheduledThreadExecutor实现类)
    3.计算结果(返回结果 Future接口,FutureTask实现类)

    ===============Executors现成的线程池========jdk自带线程池====

    1 Executors.FixedThreadPool 核心数=容纳的最大线程数=N     
       无界队列(当队列过多时,会造成无限循环)
    2 Executors.CachedThreadPool 容纳的最大线程数=无界  
      主线程提交任务的速度高于 maximumPoolSize中线程处理任务的速度时 CachedThreadPool将会不断的创建新的线程,
      在极端情况下, 
      CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源
    3 Executors.SingleThreadExecutor 核心数=容纳的最大线程数=1 始终保持只有一个线程在执行 
       无界队列(当队列过多时,会造成无限循环)

    ===============自定义Executors===========jdk自带线程池====================

    ExecuteService threadPool = new ThreadPoolExecutor(int corePoolSize,
                    int maximumPoolSize,
                    long keepAliveTime,
                    TimeUnit unit,
                    BlockingQueue workQueue,
                    ThreadFactory threadFactory,
                    RejectedExecutionHandler handler);

    //设置线程池的前缀
    ThreadFactory threadFactory = new ThreadFactoryBuilder()
                    .setNameFormat("trhead-pool-%d").build();
    //设置决绝策略
    RejectedExecutionHandler: 
    AbortPolicy:抛出RejectedExecutionException
    CallerRunsPolicy:直接在execute方法的调用线程中运行被拒绝的任务。
    DiscardOldestPolicy:放弃最旧的未处理请求,重试execute。
    DiscardPolicy:丢弃被拒绝的任务。

    ================处理流程===================jdk 与 spring =====================

    1.核心线程池是否在执行任务,不在执行就选一条线程执行,否则查看核心线程池是否已满
    2.核心线程池是否满,不满则创建一条线程执行,否值查看队列是否已满
    3.队列是否满,队列不满加入队列,否则查看线程池是否已满
    4.线程池是否已满,线程池不满创建一条线程池,否则根据决绝策略处理

    # 1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,是就执行第二步。
    # 2.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。
    # 3.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。
    # 4.查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略(拒绝策略)处理无法执行的任务。
     

  • 相关阅读:
    数字图像处理(十二)最大熵算法
    SQL Developer中执行批量SQL语句
    每日编程——射击比赛
    《算法设计与分析(第4版)》笔记——第 1 章 算法入门
    汽车诊断仪算法保护芯片——LKT4305-GM
    Docker/Linux 安装Mysql
    【Sklearn学习】Sklearn的数据集介绍
    Eureka的介绍与使用
    求A^B的最后三位数表示的整数。说明:A^B的含义是“A的B次方”(快速幂Java实现)
    python+django社区医院诊所医疗管理系统_6t4o8
  • 原文地址:https://blog.csdn.net/qq_37778018/article/details/126767305