Spring boot如何通过@Scheduled实现定时任务及多线程配置

下面我将为您详细讲解 Spring Boot 如何通过 @Scheduled 实现定时任务及多线程配置。

什么是@Scheduled?

@Scheduled 是 Spring 框架提供的用于定时执行任务的注解,通过它可以配置定时执行的任务的时间。我们可以通过该注解实现定时任务的执行。

如何使用@Scheduled ?

在使用 @Scheduled 注解之前,需要在启动类上添加 @EnableScheduling 注解,该注解会启动 Spring Boot 对定时任务的支持。

@SpringBootApplication
@EnableScheduling
public class SpringBootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }
}

然后再在需要执行定时任务的方法上添加 @Scheduled 注解,并根据我们的需要设置时间表达式。时间表达式的语法与 Linux 的 crontab 语法类似,如下所示:

@Scheduled(cron="0 0/1 * * * ?") // 每分钟执行一次
public void doSomething() {
    // todo
}

或者使用固定的时间间隔,如下所示:

@Scheduled(fixedRate = 60000) // 每 60 秒执行一次
public void doSomething() {
    // todo
}

多线程配置

在使用 @Scheduled 注解时,如果我们不进行多线程配置,那么任务将会在定时任务所在的线程中执行,如果定时任务的逻辑比较耗时,就会导致整个线程挂起,影响整个应用的性能。

所以我们需要将定时任务的逻辑放到新的线程中运行,以异步方式执行定时任务。

我们可以通过 @EnableAsync 注解来开启 Spring Boot 对异步任务的支持,然后再将异步执行的任务方法上加上 @Async 注解,如下所示:

import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Async;

@SpringBootApplication
@EnableScheduling
@EnableAsync // 开启 Spring 对异步任务的支持
public class SpringBootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

    @Async // 声明方法使用异步方式执行
    @Scheduled(fixedRate = 60000) // 每 60 秒执行一次
    public void doSomething() {
        // todo
    }
}

这样,定时任务就可以使用新的线程执行,不会影响整个应用的性能。

示例说明

下面示例将展示如何使用 @Scheduled 注解定时执行任务并使用多线程配置。

import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;

@SpringBootApplication
@EnableScheduling
@EnableAsync // 开启 Spring 对异步任务的支持
public class SpringBootDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootDemoApplication.class, args);
    }

    @Async // 声明方法使用异步方式执行
    @Scheduled(fixedRate = 5000) // 每 5 秒执行一次
    public void task() {
        System.out.println("定时任务开始,线程名:" + Thread.currentThread().getName());
        try {
            Thread.sleep(3000); // 模拟耗时操作
            System.out.println("定时任务结束,线程名:" + Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,我们定义了一个定时任务 task,并使用 @Async 注解启用异步执行,@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次 task 方法。在 task 方法中打印线程名并模拟耗时操作,以便观察异步执行的效果。

启动应用后,我们可以在控制台看到每隔 5 秒输出一次类似如下的日志:

定时任务开始,线程名:scheduling-1
定时任务结束,线程名:task-1

可以看到,每次定时任务都在新的线程中异步执行,不会阻塞应用主线程的执行,避免了性能问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring boot如何通过@Scheduled实现定时任务及多线程配置 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java多线程锁机制相关原理实例解析

    Java多线程锁机制相关原理实例解析 概述 Java的多线程编程是一种很常见的编程方式,为保证多线程运行时数据安全性,需要使用锁机制。本篇文章将详细介绍Java多线程锁机制相关原理实例解析。 锁机制相关原理 什么是锁? 锁(Lock)是多线程编程中用来保护共享资源的机制。当多线程同时访问共享资源时,可能会出现数据竞争(Data Race)问题。数据竞争指多个…

    多线程 2023年5月16日
    00
  • Thread线程的基础知识及常见疑惑点总结

    下面是关于”Thread线程的基础知识及常见疑惑点总结”的完整攻略,包括定义、使用方法、常见疑惑点等。 1. Thread线程的定义 线程是程序中一个单一的顺序执行路径,程序中有多个线程共同执行,每个线程都有自己的任务,所有线程都共享同一块内存空间。 简单来说,线程就是在单个程序中同时运行多项任务的方式,最终完成程序的所有任务。 2. Thread线程的使用…

    多线程 2023年5月16日
    00
  • Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解 介绍 本篇文章主要讲解Java并发编程中的三种常用同步工具:CountDownLatch、CyclicBarrier和Semaphore。这三种工具都可以用于协调线程的执行,但实现的方式有所不同。 CountDownLatch:用于等待多个线程执行完毕后…

    多线程 2023年5月17日
    00
  • Redis高并发情况下并发扣减库存项目实战

    Redis高并发情况下并发扣减库存项目实战 项目背景 很多电商平台在购物高峰期会面临商品库存不足的问题,而库存紧张问题不但要求电商平台提高库存的数量,也要求电商平台优化库存的流程,实现高效扣减库存。 本项目利用Redis实现库存扣减,具体做法是:每次库存变动可以作为一个事务放到Redis的事务队列中,通过WATCH命令加锁机制,避免并发扣减库存冲突。 项目实…

    多线程 2023年5月16日
    00
  • php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题

    要解决抢购、秒杀、抽奖等大流量并发入库导致的库存负数问题,我们需要采取以下的攻略: 1. 库存加锁 由于大流量的并发操作,不同用户对同一库存的操作会相互影响,导致库存出现负数。为了解决这个问题,我们需要加锁来限制并发访问。在PHP中可以使用Redis或Memcached实现锁机制。 具体地,我们可以: 使用Redis实现加锁 $redis = new Red…

    多线程 2023年5月17日
    00
  • C# 异步多线程入门到精通之ThreadPool篇

    C# 异步多线程入门到精通之ThreadPool篇攻略 在C#程序中,如果需要同时执行多个任务,则要使用多线程技术。但是在使用多线程时,我们需要注意资源竞争和死锁的问题。如果不处理好这些问题,程序可能会出现异常错误。 C#提供了ThreadPool类,可以简化多线程的编程。ThreadPool类可以在应用程序中创建一个线程池,然后将多个任务加入到线程池中,线…

    多线程 2023年5月17日
    00
  • Linux高并发踩过的坑及性能优化介绍

    Linux高并发踩过的坑及性能优化介绍 前言 首先需要明确的是,在开发高并发应用时,绝不仅仅是写出高并发的代码就够了,还需要在系统层面、网络层面和硬件层面做出一系列的优化,才能真正提高系统的性能和稳定性。 在本文中,我将从以下几个方面来讲解“Linux高并发踩过的坑及性能优化介绍”: 系统层面的优化 网络层面的优化 硬件层面的优化 系统层面的优化 1. 文件…

    多线程 2023年5月16日
    00
  • 使用.Net实现多线程经验总结

    使用.Net实现多线程是提高程序并发处理能力的一种常用手段。下面将分享我的实战经验总结,并提供两个示例说明。 前置知识 在开始学习.Net多线程前,建议对以下知识有一定的掌握:- C#编程语言- 简单的数据结构和算法- 操作系统原理中进程和线程的概念 多线程设计原则 在多线程编程中,要遵循以下原则,保证程序的正确性和高效性: 避免竞态条件。 多个线程并发执行…

    多线程 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部