首页 > 其他分享 >@Async使用ThreadPoolTaskExecutor 多线程

@Async使用ThreadPoolTaskExecutor 多线程

时间:2024-08-19 11:05:20浏览次数:12  
标签:ArrayList list new 线程 executor Async 多线程 ThreadPoolTaskExecutor

SpringBoot中的线程池ThreadPoolTaskExecutor,@Async的使用

线程池

@Configuration
@EnableAsync
public class ExcutorConfig {
    @Bean(name = "ThreadPoolTaskExecutor")
    public ThreadPoolTaskExecutor ThreadPoolTaskExecutor(){
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程数量,线程池创建时候初始化的线程数
        executor.setCorePoolSize(5);
        //最大线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        executor.setMaxPoolSize(15);
        //缓冲队列,用来缓冲执行任务的队列
        executor.setQueueCapacity(20);
        //当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
        executor.setKeepAliveSeconds(600);
        //设置好了之后可以方便我们定位处理任务所在的线程池
        executor.setThreadNamePrefix("MyThreadPool");
        //用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //该方法用来设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        executor.setAwaitTerminationSeconds(60);
        //线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 初始化
        // 通过spring @Bean方式注入ThreadPoolTaskExecutor实例时,可以不需要这一步。
        // 由于ThreadPoolTaskExecutor继承了ExecutorConfigurationSupport,初始化对象时会调用ExecutorConfigurationSupport.afterPropertiesSet()
        executor.initialize();
        return executor;
    }
}

异步方法,指定使用线程池 :ThreadPoolTaskExecutor

 @Async("ThreadPoolTaskExecutor")
    public void writeFile(List<String> list, CountDownLatch count){
        try (BufferedOutputStream bos = new BufferedOutputStream(Files.newOutputStream(Paths.get("output.txt")))) {
            bos.write(String.join("", list).getBytes());
            log.info("{}{}", "---"+System.currentTimeMillis()+"--- ", "ThreadName: "+Thread.currentThread().getName());
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            count.countDown();
        }
    }

调用异步方法

    public void testThreadWrite(){

        ArrayList<ArrayList<String>> lists = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            ArrayList<String> list = new ArrayList<>();
            for (int j = 0; j < 100000; j++) {
                list.add("jinnanDu:"+"_"+j+"_"+i);
            }
            lists.add(list);
        }
        CountDownLatch count = new CountDownLatch(lists.size());
        for(ArrayList<String> list : lists){
           asyncService.writeFile(list,count);
        }
 //所有任务执行完成后,日志打印结果
        try {
            count.await();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        log.info("all jobs finished");
    }

执行结果

标签:ArrayList,list,new,线程,executor,Async,多线程,ThreadPoolTaskExecutor
From: https://www.cnblogs.com/jinnandu/p/18363211

相关文章

  • C++中的多线程编程和锁机制
    二、多线程、锁2.1C语言线程库pthread(POSIXthreads)2.2.1线程创建pthread_create#include<pthread.h>pthread_tthread;ThreadDataargs={1,"Hellofromparameterizedthread"};intresult=pthread_create(&thread,attr,function,args); //线程创建即......
  • 026、Vue3+TypeScript基础,使用async和await来异步读取axios的网络图片
    01、App.vue代码如下:<template><divclass="app"><h2>App.Vue</h2><Person/></div></template><scriptlang="ts"setupname="App">//JS或TSimportPersonfrom'./......
  • JavaEE篇:多线程(1)
    一认识线程(Thread)1.1概念1.1.1线程是什么?线程被创建出来是为了完成分配给它的任务。线程又称轻量级进程,是操作系统的基本调度单位。一个线程就是一个执行流。线程的创建销毁和切换都比进程更加的方便。进程是操作系统分配资源的基本单位,线程的创建和释放不涉及资源分配......
  • Thread-多线程
    多线程并发与并行(了解)并行(parallel):指多个事件任务在同一时刻发生(同时发生)。指在同一时刻,有多条指令在多个处理器上同时执行。单核CPU同一时刻只能处理一条指令,所以单核CPU做不到并行处理。并发(concurrency):指两个或多个事件在同一个微小的时间段内发生。指在同一个时刻只能有一......
  • delphi多线程文件复制怎么实现
    在Delphi中,可以使用TThread类来实现多线程文件复制。以下是一个示例代码:unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls;type......
  • C++多线程详解 | 线程创建 | 互斥锁 | 条件变量 | 线程池
    目录前言1.线程创建2.互斥锁3.lock_guard与std::unique_lock4.condition_variable 5.线程池前言在说线程之前,先说说进程和线程的关系,以及什么是多线程(为了方便理解就用大白话来说)进程:进程就是运行中的程序,比如说一个微信的程序,你双击它,它运行起来了就是一个进程,在还......
  • 面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方
    面试题:在Java中,多线程编程是常见的并发处理方式。请简述Java中实现多线程的几种主要方式,并解释每种方式的基本思想。更多关于多线程编程的深入解析、面试技巧、以及实战项目源码,手机浏览器即可访问面霸宝典【全拼音】.com,这里不仅可以优化你的简历,还能进行模拟面试,获取最新最......
  • 【python学习】Asyncio库的真正力量:如何用Python编写高效并发程序
    目标读者群体及文章解决的问题这篇文章适合对Python编程有一定了解的开发者,尤其是希望深入理解并掌握异步编程的读者。通过对asyncio库的全面解析,我们将结合2023年环法冠军温格高的夺冠故事,帮助你掌握如何在Python中使用异步编程处理复杂的并发任务,避免常见的错误,并提高代......
  • C++编程:内存栅栏(Memory Barrier)详解及在多线程编程中的应用
    文章目录0.引言1.什么是内存栅栏?2.为什么需要内存栅栏?本质原因是什么?2.1编译器优化2.2CPU乱序执行3.ARM64和x86架构下的内存栅栏差异3.1x86架构3.2ARM64架构4.代码示例4.1代码解析4.2memory_order_release和memory_order_acquire解释4.3为什么是“releas......
  • nuxt2 优化asyncData 里多个接口await串行请求的弊端,改为并行请求
    优化前多个接口await串行请求,若一个接口用时1秒,3个接口一共得用时3秒才行asyncasyncData(){letres1=awaitdanielService.getAllDanielByIndex();letres2=awaitjournalService.getJournalType();letparams={page:1,pagesize:10,......