目录
一: ThreadPoolTaskExecuto
二: ThreadPoolTaskScheduler 
三 @Scheduled实现定时任务,注解开启定时任务
四:Spring中的异步任务
五:献上一颗自java自定义线程池:
首页 Java java教程 Springboot自带线程池怎么实现

Springboot自带线程池怎么实现

Jun 28, 2023 pm 04:33 PM
线程池

一: ThreadPoolTaskExecuto

1 ThreadPoolTaskExecutor线程池:

ThreadPoolTaskExecutor是Spring基于java本身的线程池ThreadPoolExecutor做的二次封装,主要目的还是为了更加方便的在spring框架体系中使用线程池, 是Spring中默认的线程池

2 使用ThreadPoolTaskExecutor注入bean到ioc中
  配置文件形式,Spring会自动配置

## 默认线程池配置,ThreadPoolTaskExecutor 
# 核心线程数
spring.task.execution.pool.core-size=8  
# 最大线程数
spring.task.execution.pool.max-size=16
# 空闲线程存活时间
spring.task.execution.pool.keep-alive=60s
# 是否允许核心线程超时
spring.task.execution.pool.allow-core-thread-timeout=true
# 线程队列数量
spring.task.execution.pool.queue-capacity=100
# 线程关闭等待
spring.task.execution.shutdown.await-termination=false
spring.task.execution.shutdown.await-termination-period=
# 线程名称前缀
spring.task.execution.thread-name-prefix=demo_Thread
登录后复制

配置形式:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledFuture;
//@Configuration
public class ThreadConfig {
    @Value("${task.maxPoolSize}")
    private int maxPoolSize;
    //todo 其他的相关配置都可以通过配置文件中注入
    @Bean("ThreadPoolTaskExecutor")
    public Executor myAsync() {
        final ThreadPoolTaskExecutor executor =
                new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        //todo  其他参数设置
        //初始化
        executor.initialize();
        return executor;
    }
}
登录后复制

3 创建线程后全部从ioc中获取线程池子

4 线程池处理流程:

(1) 查看核心线程池是否已满,不满就创建一条线程执行任务,核心线程数量已满就查看任务队列是否已满不满就将线程存储在任务队列中任务队列已满,就查看最大线程数量,不满就创建线程执行任务,已满就按照拒绝策略执行

(2) 拒绝策略:

  • CallerRunsPolicy():原来的线程执行

  • AbortPolicy():直接抛出异常

  • DiscardPolicy():直接丢弃

  • DiscardOldestPolicy():丢弃队列中最老的任

二: ThreadPoolTaskScheduler 

1 ThreadPoolTaskScheduler 定时调度任务线程池,处理异步任务

2 使用方式: 注入 ThreadPoolTaskScheduler的bean

 (1) 配置文件形式:..
 (2) 配置类形式:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ScheduledFuture;
@Configuration
public class ThreadPoolTaskSchedulerConfig {
    @Bean
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
        final ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        //设置等待任务在关机时l候完成
        threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
        //设置等待时间为60s
        threadPoolTaskScheduler.setAwaitTerminationSeconds(60);
        return threadPoolTaskScheduler;
    }
}
登录后复制

3  使用ThreadPoolTaskScheduler定时任务

做普通线程池使用:

  •  submit(callable),需要执行结果

  •  submit(runnable),不需要执行结果

(1) 定时任务

 添加任务内容Runnable,设置执行周期Trigger/Date,Trigger表达式百度即可

 schedule(Runnable task,Trigger)
 schedule(Runnable task,Date)
登录后复制

(2) 指定间隔时间执行一次任务,时间间隔是前一次任务完成到下一次任务开始,单位毫秒

 scheduleWithFixedDelay(Runnable task,long delay)
登录后复制

(3) 固定频率执行任务,在任务开始后间隔一段时间执行新的任务,如果上次任务么执行完成,则等待上次任务执行完成后执行下次任务

 scheduleAtFixedRate(Runnable task,long delay)
登录后复制

(4) 定时任务取消:

设置定时任务存储的集合,定时任务执行的结果为ScheduledFuture,将该对象存储到集合,通过在集合中获取ScheduledFuture对象.cancel(true)取消定时任务

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Service;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.*;
@Service
public class SchedulerService {
    @Autowired
    ThreadPoolTaskScheduler scheduler;
    /**
     * 常规线程池使用
     */
    public void tesScheduler1() throws ExecutionException, InterruptedException {
        //无返回值
        final Future<?> demo_scheduler1 = scheduler.submit(new Runnable() {
            @Override
            public void run() {
                System.out.println("demo runnable scheduler");
            }
        });
        //无返回值
        final Future<?> demo_scheduler2 = scheduler.submit(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                System.out.println("demo callable  scheduler");
                return "callable";
            }
        });
        System.out.println("result:" + demo_scheduler2.get());
    }
    /**
     * 定时任务
     */
    public void tesScheduler2() throws ParseException {
        //CronTrigger表达式百度即可
        scheduler.schedule(() -> {
            System.out.println("定时任务");
        }, new CronTrigger("0/1****?"));
        //创建指定时间的日期
        final Date date = new Date(2023, 3, 26, 21, 35);
        final DateFormat format = new SimpleDateFormat();
        final Date parse = format.parse("2023-03-26-21-26");
        scheduler.schedule(() -> {
            System.out.println(new Date());
        }, parse);
    }
    /**
     * 指定时间间隔执行任务,上次任务结束到下次任务开始的时间间隔
     */
    public void tesScheduler3() {
        scheduler.scheduleWithFixedDelay(() -> {
            //todo
        }, 300L);
    }
    /**
     * 固定频率执行任务,在固定一段时间后便会执行下次任务,
     * 如果时间到了上次任务还没执行完毕则等待,
     * 直到上一次任务执行完毕后立马执行下次任务
     */
    public void tesScheduler4() {
        scheduler.scheduleAtFixedRate(new FutureTask<String>(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        return null;
                    }
                }),
                200);
    }
    //取消定时任务队列
    public static ConcurrentMap<String, ScheduledFuture> map = new ConcurrentHashMap<>();
    public void startTask(String k1) {
        map.compute(k1, (k, v) -> {
            if (map.containsKey(k)) return v;
            map.put(k, v);
            return v;
        });
    }
}
登录后复制

三 @Scheduled实现定时任务,注解开启定时任务

1 使用@EnableScheduled开启支持

2 @Scheduled标注方法

 (1)@Scheduled(fixedDelay=5000)延迟执行,5s后执行
 (2)@Scheduled(fixedRate=5000)定时执行,每隔五秒就进行执行
 (3)@Scheduled(corn="002**?") 自定义执行,corn表达式百度,常用这种执行方式,corn="002**?"每天凌晨两点开始执行定时任务

3 注意@Scheduled开启的任务是单线程的,容易阻塞

 (1) 在ioc中注入ThreadPoolTaskScheduler,则Scheduled就使用ThreadPoolTaskScheduler线程池,可以解决单线程阻塞问题
 (2) @Scheduled和@Async注解开启定时任务,在@Async("pool")中指定线程池,若是没有指定线程池会使用Spring的SimpleAsyncTaskExecutor线程池,这个线程池每次都会增加一个线程去执行任务,效率低下

四:Spring中的异步任务

1 @EnableAsync开启异步支持
2 @Async开启异步任务,指定线程池

注意:@Scheduled和@Async注解开启定时任务,在@Async("pool")中指定线程池,若是没有指定线程池会使用Spring的SimpleAsyncTaskExecutor线程池,这个线程池每次都会增加一个线程去执行任务,效率低下但是@Async单独开启异步任务,则使用的是默认的线程池,建议根据需求自定义线程池

注意:@Async的返回值只能为void或Future, 调用方和@Async不能在一个类中,否则不走aop;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncService {
    @Async
    public void showThreadName1() {
        //默认线程池
        System.out.println(Thread.currentThread().getName());
    }
    @Async("myPool")//指定线程池
    public void showThreadName2() {
        System.out.println(Thread.currentThread().getName());
    }
}
登录后复制

五:献上一颗自java自定义线程池:

 @Bean("myPool")
    public Executor executor(){
       return new ThreadPoolExecutor(// 自定义一个线程池
                1, // coreSize
                2, // maxSize
                60, // 60s
                TimeUnit.SECONDS, new ArrayBlockingQueue<>(3) // 有界队列,容量是3个
                , Executors.defaultThreadFactory()
                , new ThreadPoolExecutor.AbortPolicy());
    }
登录后复制

java自带的线程池,缓存,固定数量的,单线程的,定时的,,,,六七种,后面续上

以上是Springboot自带线程池怎么实现的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Python 获取旅游景点信息及评论并作词云、数据可视化 Python 获取旅游景点信息及评论并作词云、数据可视化 Apr 11, 2023 pm 08:49 PM

大家好,我是啃书君!正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢?今天将手把手教你使用线程池爬取同程旅行的景点信息及评论数据并做词云、数据可视化!!!带你了解各个城市的游玩景点信息。在开始爬取数据之前,我们首先来了解一下线程。线程进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程:是轻量级的进程,是程序执行的最小单元,是进程的一个执行路径。一

Linux系统下常见的服务器负载问题及其解决方法 Linux系统下常见的服务器负载问题及其解决方法 Jun 18, 2023 am 09:22 AM

Linux是一款优秀的操作系统,广泛应用于服务器系统中。在使用Linux系统的过程中,服务器负载问题是一种常见的现象。服务器负载是指服务器的系统资源无法满足当前的请求,导致系统负载过高,从而影响服务器性能。本文将介绍Linux系统下常见的服务器负载问题及其解决方法。一、CPU负载过高当服务器的CPU负载过高时,会导致系统响应变慢、请求处理时间变长等问题。当C

如何在Java 7中使用线程池来实现任务的循环调度 如何在Java 7中使用线程池来实现任务的循环调度 Jul 29, 2023 pm 10:37 PM

如何在Java7中使用线程池来实现任务的循环调度引言:在开发Java应用程序时,使用线程池可以提高任务的执行效率和资源利用率。在Java7中,使用线程池可以很方便地实现任务的循环调度。本文将介绍如何在Java7中使用线程池来实现任务的循环调度,并附上相应的代码示例。一、概述:线程池是一种多线程处理结构,它可以重复使用固定数量的线程,从而避免频繁地创建和

如何在Java 7中使用线程池来实现任务的优先级调度 如何在Java 7中使用线程池来实现任务的优先级调度 Jul 30, 2023 pm 06:38 PM

如何在Java7中使用线程池来实现任务的优先级调度在并发编程中,任务的优先级调度是一个常见的需求。Java提供了线程池的机制,使得我们可以方便地管理和调度任务。本文将介绍如何在Java7中使用线程池来实现任务的优先级调度。首先,我们需要了解Java7中线程池的基本概念和用法。线程池是一种重用线程的机制,它可以管理和调度一组线程来执行多个任务。Java提

微服务架构中如何处理服务的线程池和任务调度? 微服务架构中如何处理服务的线程池和任务调度? May 17, 2023 am 08:36 AM

随着微服务架构在企业级应用中的广泛应用,对于如何优化微服务的性能和稳定性也成为了人们关注的焦点。在微服务中,一个微服务可能会处理数千个请求,而服务的线程池和任务调度也是微服务性能和稳定性的重要组成部分。本文将介绍微服务架构中的线程池和任务调度,以及如何在微服务中优化线程池和任务调度的性能。一、微服务架构中的线程池在微服务架构中,每个微服务处理的请求都会占用其

如何使用Java中的ExecutorCompletionService函数进行线程池任务调度 如何使用Java中的ExecutorCompletionService函数进行线程池任务调度 Jun 26, 2023 pm 02:49 PM

随着互联网技术的发展,多线程编程的重要性越来越凸显出来。在编写高并发程序时,充分利用多线程技术可以大大提高程序的执行效率。然而,多线程编程本身就涉及到许多问题,例如线程间的通信、同步协作等。为了解决这些问题,Java提供了许多线程池框架,其中ExecutorCompletionService是其中之一。本文将介绍ExecutorCompletionServi

spring线程池在哪配置 spring线程池在哪配置 Jan 19, 2024 pm 04:55 PM

配置spring线程池的方法:1、使用ThreadPoolTaskExecutor Bean;2、使用SimpleAsyncTaskExecutor;3、在XML中使用TaskExecutor Bean;4、使用第三方库;5、自定义实现;6、通过系统属性或环境变量配置;7、集成与容器;8、编程式配置;9、使用第三方框架集成;10、混合配置;11、考虑资源限制和约束等等。

Springboot自带线程池怎么实现 Springboot自带线程池怎么实现 Jun 28, 2023 pm 04:33 PM

一:ThreadPoolTaskExecuto1ThreadPoolTaskExecutor线程池:ThreadPoolTaskExecutor是Spring基于java本身的线程池ThreadPoolExecutor做的二次封装,主要目的还是为了更加方便的在spring框架体系中使用线程池,是Spring中默认的线程池2使用ThreadPoolTaskExecutor注入bean到ioc中配置文件形式,Spring会自动配置##默认线程池配置,ThreadPoolTaskExecutor#核心

See all articles