软件编程
位置:首页>> 软件编程>> java编程>> Spring 与 JDK 线程池的简单使用示例详解

Spring 与 JDK 线程池的简单使用示例详解

作者:羁客%  发布时间:2023-08-20 04:02:59 

标签:Spring,JDK,线程池

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

@Configuration
@EnableAsync
public class ThreadPoolConfig{

//主要任务的调度,计划执行
 @Bean("taskScheduler")
 public Executor createScheduler(){
   // 创建一个线程池对象
       ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
       // 定义一个线程池大小
       scheduler.setPoolSize(100);
       // 线程池名的前缀
       scheduler.setThreadNamePrefix("taskScheduler-");
       // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
       scheduler.setWaitForTasksToCompleteOnShutdown(true);
       // 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
       scheduler.setAwaitTerminationSeconds(60);
       // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
       scheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
   return scheduler;
 }

//主要任务的执行
 @Bean("taskExecutor")
 public Executor createExecutor(){
   // 创建一个线程池对象
       ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程池大小
       executor.setCorePoolSize(10);
       //最大线程数
       executor.setMaxPoolSize(30);
       //队列容量
       executor.setQueueCapacity(100);
       //活跃时间
       executor.setKeepAliveSeconds(60);
       //线程名字前缀
       executor.setThreadNamePrefix("taskExecutor-");
       // 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
       executor.setWaitForTasksToCompleteOnShutdown(true);
       // 线程池对拒绝任务的处理策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
       executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
       return executor;
 }

}

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

@Component
public class TaskComponent{
 @Async("taskExecutor")
 public void doTaskExecutor() {
System.out.println("任务开始执行!!!");
 //具体的执行任务
//。。。。。。。
 }

//  //有返回值(ObjectVo为自己定义的返回类型)
//@Async("taskExecutor")
//public Future<ObjectVo> doTaskExecutor() {
//System.out.println("任务开始执行!!!");
//  //具体的执行任务
////。。。。。。。
//ObjectVo result=new ObjectVo();
//return new AsyncResult<>(result);
//}
 @Async("taskScheduler")
 public void doTaskScheduler() {
System.out.println("任务开始调度!!!");
 //具体的调度任务
//。。。。。。。
 }

//  //有返回值(ObjectVo为自己定义的返回类型)
//@Async("taskScheduler")
//public Future<ObjectVo> doTaskScheduler() {
//System.out.println("任务开始调度!!!");
//  //具体的调度任务
////。。。。。。。
//ObjectVo result=new ObjectVo();
//return new AsyncResult<>(result);
//}
}

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

@Service
public class UserServiceImpl implements UserService{
 @Autowired
 private TaskComponent taskComponent;
 //测试任务执行与调用
 @SneakyThrows
 @Override
 public void testTask(){
//没有返回值
taskComponent.doTaskExecutor();
taskComponent.doTaskScheduler();

//有返回值
//Future<ObjectVo> executorResult = taskComponent.doTaskExecutor();
//Future<ObjectVo> schedulerResult = taskComponent.doTaskScheduler();
//System.out.println(executorResult.get());
//System.out.println(schedulerResult.get());
 }
}

===============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<Runnable> 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.查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略(拒绝策略)处理无法执行的任务。

来源:https://blog.csdn.net/qq_37778018/article/details/126767305

0
投稿

猜你喜欢

  • 具体安装步骤,不再赘述,仅附上个人工作、学习中的对 EasyCode 的详细配置。插件链接地址:https://gitee.com/make
  • 本文实例讲述了java中struts2实现文件上传下载功能实现方法。分享给大家供大家参考。具体分析如下:1.文件上传首先是jsp页面的代码在
  • 最新开发新项目的时候,要做分享项目,要求分享有微信,微信朋友圈,QQ,QQ空间,新浪微博这五个,所分享内容包括,分享纯图片,纯文字,图文类型
  • 有一天,你写了好多好多带“形参”的构造函数(就是“方法”,同义),而且需要向这些构造函数里传递同样的“实参”,然后你就憨憨地一个一个函数的调
  • 最近做的项目,需要将一些信息导出到word中。在网上找了好多解决方案,现在将这几天的总结分享一下。目前来看,java导出word大致有6种解
  • 本文为大家分享了swing实现窗体拖拽和拉伸的具体代码,供大家参考,具体内容如下当用setUndecorated(true) 后 JFram
  • 类与对象:类是抽象的数据类型,对象是抽象的数据类型的具体化。使用new 关键字创建对象,默认初始化为null一个项目只存在一个main方法,
  • 背景后台系统需要接入 企业微信登入,满足企业员工快速登入系统流程图简单代码说明自定义一套 springsecurity 认证逻辑主要就是 根
  • 1、匿名内部类内部类:在一个类的内部定义了另外的类,称为内部类,匿名内部类指的是没有名字的内部类。为了清楚内部类的主要作用,下面首先观察一个
  • 一.瀑布模型瀑布模型严格遵循软件生命周期各阶段的固定顺序:计划、分析、设计、编程、训试和维护,上一阶段完成后才能进入到下一阶段, 整个模型就
  • private void btnCreate_Click(object sender, EventArgs e) ...{ int hWnd
  • 前言最近学习netty的时候发现nio包下有个FileChannel类,经过了解这个类作用是个专门负责传输文件的通道,支持多线程,而且经过反
  • 一、问题分析入门案例的内容已经做完了,在入门案例中我们创建过一个SpringMvcConfig的配置类,再回想前面咱们学习Spring的时候
  • 代码如下所示:<!-- 配置数据源 -->  <bean id="dataSource" c
  • 引言应用 Java 的开源库,编写一个搜索引擎,这个引擎能爬取一个网站的内容。并根据网页内容进行深度爬取,获取所有相关的网页地址和内容,用户
  • 线程池中ThreadGroup的坑在Java中每一个线程都归属于某个线程组管理的一员,例如在主函数main()主工作流程中产生一个线程,则产
  • Spring Cloud Gateway去掉url前缀主要是增加一个 route,其他配置不变routes:  - id: ser
  • 邮件绑定功能【需求】1、 用户注册时,输入邮箱2、 通过Javamail技术,向用户邮箱发送一封祝贺邮件1、javamail发送邮件1.1、
  • 在request中可以获取到来自Http请求的body数据比如获取json格式数据代码:import com.alibaba.dubbo.c
  • Java停止线程的逻辑(协同、通知)在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止。但是当我们调用interr
手机版 软件编程 asp之家 www.aspxhome.com