最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用Scheduling實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼

 更新時(shí)間:2023年08月13日 14:46:03   作者:palm down  
Spring Boot提供了一種方便的方式來實(shí)現(xiàn)定時(shí)任務(wù),即使用Spring的@Scheduled注解,通過在方法上添加@Scheduled注解,我們可以指定方法在何時(shí)執(zhí)行,本文我們就給大家介紹一下SpringBoot如何使用Scheduling實(shí)現(xiàn)定時(shí)任務(wù),需要的朋友可以參考下

springboot實(shí)現(xiàn)定時(shí)任務(wù)

開啟springboot定時(shí)任務(wù)

  • springboot實(shí)現(xiàn)定時(shí)任務(wù)很簡(jiǎn)單,只需要在啟動(dòng)類上加上 @EnableScheduling 就可以
/**
 * @author liouwb
 */
@SpringBootApplication
@EnableScheduling
public class SchedulerApplication{
    public static void main(String[] args) {
        SpringApplication.run(SchedulerApplication.class, args);
    }
}
  • 編寫測(cè)試類
/**
 * @author liouwb
 */
@Slf4j
@Component
public class TestJob {
    /**
     * 定時(shí)任務(wù)-串行
     * 固定一秒執(zhí)行一次
     *
     * @author liouwb
     */
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask1() {
        log.info("測(cè)試任務(wù)-1");
    }
}
  • 執(zhí)行結(jié)果

在這里插入圖片描述

  • 下面測(cè)試,如果讓每次任務(wù)執(zhí)行5秒
    /**
     * 定時(shí)任務(wù)-串行
     * 固定一秒執(zhí)行一次
     *
     * @author liouwb
     */
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask1() throws InterruptedException {
        // 讓每次任務(wù)執(zhí)行5秒
        Thread.sleep(5 * 1000);
        log.info("測(cè)試任務(wù)-1");
    }
  • 想要的結(jié)果是1一秒執(zhí)行一次
  • 實(shí)際執(zhí)行結(jié)果,是6秒執(zhí)行一次,線程串行執(zhí)行
  • 未達(dá)到想要的接口

在這里插入圖片描述

原因分析:

  • @EnableScheduling 注解默認(rèn)使用的是 ThreadPoolTaskScheduler 線程池,默認(rèn)線程數(shù)是1
  • 下面我們看下源碼
  • 我們看先 @EnableScheduling 注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {
}
  • 看下 SchedulingConfiguration
@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration {
	@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
		return new ScheduledAnnotationBeanPostProcessor();
	}
}
  • 看下 ScheduledAnnotationBeanPostProcessor
public ScheduledAnnotationBeanPostProcessor() {
		this.registrar = new ScheduledTaskRegistrar();
	}
  • 看下 ScheduledTaskRegistrar 類,這里使用的是 TaskScheduler 線程池
  • 默認(rèn)的是 ThreadPoolTaskScheduler

在這里插入圖片描述

在這里插入圖片描述

配置線程池,讓定時(shí)任務(wù)指定并發(fā)執(zhí)行

  • 配置線程池,實(shí)現(xiàn) SchedulingConfigurer 接口,實(shí)現(xiàn) configureTasks 方法
/**
 * 線程池配置
 *
 * @author liouwb
 * @time 2023-07-27
 */
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskScheduler());
    }
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        // 設(shè)置線程池?cái)?shù)量
        taskScheduler.setPoolSize(10);
        // 設(shè)置線程池前綴
        taskScheduler.setThreadNamePrefix("parallelScheduler-");
        return taskScheduler;
    }
}
  • 執(zhí)行結(jié)果

在這里插入圖片描述

先要線程異步執(zhí)行

在啟動(dòng)類上添加 @EnableAsync 注解

/**
 * @author liouwb
 */
@SpringBootApplication
@EnableAsync
@EnableScheduling
public class SchedulerApplication{
    public static void main(String[] args) {
        SpringApplication.run(SchedulerApplication.class, args);
    }
}
  • 再方法上添加 @Async 注解便可以讓方法異步執(zhí)行
/**
 * @author liouwb
 */
@Slf4j
@Component
public class TestJob {
    /**
     * 定時(shí)任務(wù)-串行
     * 固定一秒執(zhí)行一次
     *
     * @author liouwb
     */
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask1() throws InterruptedException {
        // 讓每次任務(wù)執(zhí)行5秒
        Thread.sleep(5 * 1000);
        log.info("測(cè)試任務(wù)-1");
    }
    @Async
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask2() {
        log.info("測(cè)試任務(wù)-2");
    }
}
  • 執(zhí)行結(jié)果,可以看到異步線程和并未用到設(shè)置的線程池

在這里插入圖片描述

springboot異步線程池設(shè)置

springboot 異步線程池默認(rèn)使用的是 ThreadPoolTaskExecutor

ThreadPoolTaskExecutor ThreadPoolTaskScheduler 都在 org.springframework.scheduling.concurrent

在這里插入圖片描述

``

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {

斷點(diǎn)可以看到默認(rèn)的異步線程池,前綴為 taskScheduler- ,默認(rèn)核心線程數(shù)為 10

默認(rèn)線程池名稱

在這里插入圖片描述

  • 下面我們自己配置異步線程池
/**
 * 線程池配置
 *
 * @author liouwb
 */
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskScheduler());
    }
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        // 設(shè)置線程池前綴
        taskScheduler.setThreadNamePrefix("parallelScheduler-");
        return taskScheduler;
    }
    /**
     * 配置異步線程池
     *
     * @author liouwb
     * @rutern org.springframework.core.task.TaskExecutor
     */
    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 設(shè)置核心線程數(shù)
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        // 設(shè)置最大線程數(shù)
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 10);
        // 設(shè)置隊(duì)列容量
        executor.setQueueCapacity(Runtime.getRuntime().availableProcessors() * 10);
        // 設(shè)置線程活躍時(shí)間(秒)
        executor.setKeepAliveSeconds(10);
        // 設(shè)置默認(rèn)線程名稱
        executor.setThreadNamePrefix("ansyScheduled-");
        // 設(shè)置拒絕策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任務(wù)結(jié)束后再關(guān)閉線程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}
  • 執(zhí)行結(jié)果,可以看到配置的線程池都生效了

在這里插入圖片描述

指定線程池執(zhí)行任務(wù)

  • 可以設(shè)置多個(gè)線程池
/**
 * 線程池配置
 *
 * @author liouwb
 * @time 2023-07-27
 */
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(taskScheduler());
    }
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        // 設(shè)置線程池前綴
        taskScheduler.setThreadNamePrefix("parallelScheduler-");
        return taskScheduler;
    }
    /**
     * 配置異步線程池
     *
     * @author liouwb
     * @rutern org.springframework.core.task.TaskExecutor
     */
    @Bean
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 設(shè)置核心線程數(shù)
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        // 設(shè)置最大線程數(shù)
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 10);
        // 設(shè)置隊(duì)列容量
        executor.setQueueCapacity(Runtime.getRuntime().availableProcessors() * 10);
        // 設(shè)置線程活躍時(shí)間(秒)
        executor.setKeepAliveSeconds(10);
        // 設(shè)置默認(rèn)線程名稱
        executor.setThreadNamePrefix("ansyScheduled-");
        // 設(shè)置拒絕策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任務(wù)結(jié)束后再關(guān)閉線程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
    /**
     * 配置異步線程池2
     *
     * @author liouwb
     * @rutern org.springframework.core.task.TaskExecutor
     */
    @Bean
    public TaskExecutor taskExecutor2() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 設(shè)置核心線程數(shù)
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        // 設(shè)置最大線程數(shù)
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 10);
        // 設(shè)置隊(duì)列容量
        executor.setQueueCapacity(Runtime.getRuntime().availableProcessors() * 10);
        // 設(shè)置線程活躍時(shí)間(秒)
        executor.setKeepAliveSeconds(10);
        // 設(shè)置默認(rèn)線程名稱
        executor.setThreadNamePrefix("異步線程池2-");
        // 設(shè)置拒絕策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任務(wù)結(jié)束后再關(guān)閉線程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}
  • 在執(zhí)行的時(shí)候指定線程池的名稱
/**
 * @author liouwb
 */
@Slf4j
@Component
public class TestJob {
    /**
     * 定時(shí)任務(wù)-串行
     * 固定一秒執(zhí)行一次
     *
     * @author liouwb
     */
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask1() throws InterruptedException {
        // 讓每次任務(wù)執(zhí)行5秒
        Thread.sleep(5 * 1000);
        log.info("測(cè)試任務(wù)-1");
    }
    /**
     * 異步執(zhí)行
     *
     * @author liouwb
     */
    @Async
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask2() {
        log.info("測(cè)試任務(wù)-2");
    }
    /**
     * 異步執(zhí)行
     * 指定使用taskExecutor2線程池
     *
     * @author liouwb
     */
    @Async(value = "taskExecutor2")
    @Scheduled(cron = "0/1 * * * * ?")
    public void testTask3() {
        log.info("測(cè)試任務(wù)-指定線程池-3");
    }
}
  • 執(zhí)行結(jié)果

在這里插入圖片描述

以上就是SpringBoot使用Scheduling實(shí)現(xiàn)定時(shí)任務(wù)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Scheduling定時(shí)任務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中JDBC連接數(shù)據(jù)庫詳解

    Java中JDBC連接數(shù)據(jù)庫詳解

    本文主要介紹了JDBC連接數(shù)據(jù)庫的相關(guān)知識(shí),具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • 基于mybatis中<include>標(biāo)簽的作用說明

    基于mybatis中<include>標(biāo)簽的作用說明

    這篇文章主要介紹了基于mybatis中<include>標(biāo)簽的作用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 深入剖析Java工廠模式讓你的代碼更靈活

    深入剖析Java工廠模式讓你的代碼更靈活

    Java工廠模式是一種創(chuàng)建對(duì)象的設(shè)計(jì)模式,它可以在不暴露對(duì)象創(chuàng)建邏輯的情況下,將對(duì)象的創(chuàng)建委托給子類或者其他對(duì)象。本文就來深入剖析一下Java工廠模式是如何讓你的代碼更靈活、可擴(kuò)展、易維護(hù)的
    2023-05-05
  • Java中如何獲取文件的上級(jí)目錄

    Java中如何獲取文件的上級(jí)目錄

    這篇文章主要介紹了Java中如何獲取文件的上級(jí)目錄問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java web數(shù)據(jù)可視化實(shí)現(xiàn)原理解析

    Java web數(shù)據(jù)可視化實(shí)現(xiàn)原理解析

    這篇文章主要介紹了Java web數(shù)據(jù)可視化實(shí)現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼

    Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼

    這篇文章主要介紹了Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java多線程Condition接口原理介紹

    Java多線程Condition接口原理介紹

    這篇文章主要介紹了Java多線程Condition接口原理介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • SpringBoot2.0整合Shiro框架實(shí)現(xiàn)用戶權(quán)限管理的示例

    SpringBoot2.0整合Shiro框架實(shí)現(xiàn)用戶權(quán)限管理的示例

    這篇文章主要介紹了SpringBoot2.0整合Shiro框架實(shí)現(xiàn)用戶權(quán)限管理的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Spring Task定時(shí)任務(wù)的配置和使用詳解

    Spring Task定時(shí)任務(wù)的配置和使用詳解

    本篇文章主要介紹了Spring Task定時(shí)任務(wù)的配置和使用詳解,實(shí)例分析了Spring Task定時(shí)任務(wù)的配置和使用的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 如何對(duì)quartz定時(shí)任務(wù)設(shè)置結(jié)束時(shí)間

    如何對(duì)quartz定時(shí)任務(wù)設(shè)置結(jié)束時(shí)間

    這篇文章主要介紹了如何對(duì)quartz定時(shí)任務(wù)設(shè)置結(jié)束時(shí)間問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

洛宁县| 巴青县| 通化市| 许昌市| 林芝县| 呼和浩特市| 望奎县| 灵台县| 拉萨市| 麻阳| 岑巩县| 屯昌县| 杭锦后旗| 大新县| 运城市| 江源县| 正镶白旗| 泗阳县| 神农架林区| 洛隆县| 育儿| 焉耆| 工布江达县| 昔阳县| 兴海县| 孟村| 青铜峡市| 汤原县| 南康市| 依兰县| 灵璧县| 泌阳县| 定襄县| 藁城市| 宿松县| 高雄县| 鲁甸县| 上犹县| 礼泉县| 游戏| 鄱阳县|