首页 > 其他分享 >Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?

Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?

时间:2023-03-04 12:44:17浏览次数:39  
标签:Scheduled 异步 taskScheduler 单线程 任务 多线程 public

@schedule刚开始用的时候回遇到一些坑,主要就是他的同步、异步、多线程的配置问题,这篇文章介绍了@schedule的使用方法,读者遇到问题时可以参考下。

1. 问题

@schedule注解默认是同步且单线程的,如果定时任务比较多或者有的定时任务比较耗时,会影响到其他定时任务的执行

@Component
public class TestSchedule {
    public  static  int i = 0;
    @Scheduled(cron = "* * * * * ?")
    public void test() throws InterruptedException {
        System.out.println(i++);
        Thread.sleep(1000 * 100);
    }
}

2. 解决方法

我们可以通过以下三种方法将其配置为多线程模式:

第一种: 增加配置类

两种方式:

@Configuration
public class ScheduleConfig {

       @Bean

    public TaskScheduler taskScheduler() {

        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();

        //核心线程池数量,方法: 返回可用处理器的Java虚拟机的数量。

        taskScheduler.setPoolSize(Runtime.getRuntime().availableProcessors() * 2);

        return taskScheduler;

    }

}

 

@Configuration

public class ScheduleConfig1 implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        scheduledTaskRegistrar.setScheduler(
                new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors() * 2)
        );
    }
}

第二种:配置文件添加task配置

spring:
  task:
    scheduling:
      pool:
        size: 8  #配置Scheduled定时任务为多线程

通过以上配置,每个任务就变成独立线程,单独执行。但对于单个任务,其仍为同步的,只有该次运行完,才会运行下一次定时任务。如果想把其变为异步任务,可开启异步方法。该方法会导致,同一个任务,即使上一次执行还未完成,只要时间到,就会再次执行该任务

第三种:异步配置

@EnableAsync // 开启异步

@Async
@Scheduled(cron = "* * * * * ?")
public void test() throws InterruptedException {
    System.out.println("TEST1 ==== " + i++);
    Thread.sleep(1000 * 100);
}

 

参考:

https://blog.csdn.net/bblzjp/article/details/128216426

标签:Scheduled,异步,taskScheduler,单线程,任务,多线程,public
From: https://www.cnblogs.com/hungryquiter/p/17178094.html

相关文章

  • 多线程
    #线程类fromthreadingimportThreaddeffunc():foriinrange(1000):print("func",1)if__name__=='__main__':t=Thread(target=func......
  • Spring默认定时@Scheduled不支持L、W、C关键字的解决办法
    1、Causedby:java.lang.IllegalStateException:Encounteredinvalid2、@Scheduledmethod'execute':Forinputstring:"L"3、查其原因是Spring默认定时@Scheduled......
  • 全局视角看技术-Java多线程演进史
    作者:京东科技文涛全文较长共6468字,语言通俗易懂,是一篇具有大纲性质的关于多线程的梳理,作者从历史演进的角度讲了多线程相关知识体系,让你知其然知其所以然。前言2022......
  • 【C#异步】异步多线程的本质,上下文流转和同步
    引言net同僚对于async和await的话题真的是经久不衰,这段时间又看到了关于这方面的讨论,最终也没有得出什么结论,其实要弄懂这个东西,并没有那么复杂,简单的从本质上来......
  • Java实验-Swing 简单多线程实验
    实验要求:多线程是生活中常见的现象,我们要让计算机程序同时做N件事,就可以通过多线程实现:如图所示,分别用Thread和Runnable两种方法各开2条线程,实现如下界面,每条线程的数字......
  • 多线程模型之生产者消费者 -- 转载
    https://www.cnblogs.com/pandamohist/p/13852197.html互斥量std::mutex:解决多个线程对共享数据的访问问题。条件变量std::condition_variable:是一种线程间的通讯机制,......
  • java 如何使用多线程调用类的静态方法?
     1.情景展示静态方法内部实现:将指定内容生成图片格式的二维码;如何通过多线程实现?2.分析之所以采用多线程,是为了节省时间 3.解决方案准备工作logo文件......
  • 一个多线程爬取http://www.infobank.cn的爬虫
    importrequestsfrombs4importBeautifulSoupimportreimportopenpyxlfrommultiprocessing.dummyimportPoolimporttimeimportos#从输入表格获取数据defread_exce......
  • 多线程和多进程的区别
    一个线程从属于一个进程;一个进程可以包含多个线程。一个线程挂掉,对应的进程挂掉,多线程也挂掉;一个进程挂掉,不影响其它进程,多进程稳定。进程系统开销显著大于线程开销;线程......
  • 第8章:多线程
    第8章多线程1、基本概念:程序、进程、线程程序(program):是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process):是程序的一次执......