SpringBoot入門八,添加定時(shí)任務(wù) 一.問(wèn)題描述   Task定時(shí)任務(wù)默認(rèn)都是使用單線程執(zhí)行的,如果定時(shí)任務(wù)有很多的話,那?..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot多線程執(zhí)行task任務(wù)

發(fā)布時(shí)間:2020-07-07 22:05:57 來(lái)源:網(wǎng)絡(luò) 閱讀:5538 作者:pannijingling 欄目:編程語(yǔ)言

SpringBoot添加定時(shí)任務(wù)入門請(qǐng)看這里=>SpringBoot入門八,添加定時(shí)任務(wù)

一.問(wèn)題描述

  Task定時(shí)任務(wù)默認(rèn)都是使用單線程執(zhí)行的,如果定時(shí)任務(wù)有很多的話,那么可能會(huì)導(dǎo)致很多任務(wù)無(wú)法按時(shí)準(zhǔn)確執(zhí)行,示例如下:

import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class TaskTest {
    private final Logger log = LoggerFactory.getLogger(TaskTest02.class);
    //輸出時(shí)間格式
    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss:sss");

    @Scheduled(cron = "0/15 * * * * ? ")
    private void sayHello(){
        String dateTime = format.format(new Date());
        log.info("{} 向宇宙發(fā)出了一聲問(wèn)候: Hello World!", dateTime);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0/16 * * * * ? ")
    private void sayHello2(){
        String dateTime = format.format(new Date());
        log.info("{} 向宇宙發(fā)出了一聲問(wèn)候: 你好,世界", dateTime);
    }
}

當(dāng)sayHello()方法執(zhí)行的時(shí)候,因?yàn)殚L(zhǎng)時(shí)間占用任務(wù)執(zhí)行線程,導(dǎo)致sayHello2()被迫向后延時(shí)執(zhí)行,如圖:

SpringBoot多線程執(zhí)行task任務(wù)

二.解決方案
方案1

添加以下代碼塊,可放置在任意一個(gè)類中,整個(gè)工程只需要添加一個(gè)即可

@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    // 設(shè)置scheduler執(zhí)行線程為3個(gè)
    scheduler.setPoolSize(3);
    return scheduler;
}

SpringBoot多線程執(zhí)行task任務(wù)

方案2(個(gè)人推薦)

添加一個(gè)配置類即可,定時(shí)任務(wù)類或方法不用做任何改變

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

/**
 * @描述: 多線程執(zhí)行定時(shí)任務(wù)
 * @日期 2019年5月28日
 */
@Configuration
public class TaskConfig {
    /**
     * @描述: 所有的定時(shí)任務(wù)都放在一個(gè)線程池中,定時(shí)任務(wù)啟動(dòng)時(shí)使用不同的線程
     * @return
     * @日期 2019年5月28日
     */
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 設(shè)置scheduler執(zhí)行線程為3個(gè)
        scheduler.setPoolSize(3);
        return scheduler;
    }
}
方案3

添加一個(gè)配置類即可(實(shí)現(xiàn)SchedulingConfigurer接口),定時(shí)任務(wù)類或方法不用做任何改變

import java.util.concurrent.Executors;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;

/**
 * @描述: 多線程執(zhí)行定時(shí)任務(wù)
 * @日期 2019年5月27日
 */
@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
    /**
     * @描述: 所有的定時(shí)任務(wù)都放在一個(gè)線程池中,定時(shí)任務(wù)啟動(dòng)時(shí)使用不同的線程
     * @param taskRegistrar
     * @日期 2019年5月27日
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //設(shè)定一個(gè)定時(shí)任務(wù)線程池,數(shù)量為3
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(3));
    }
}
三.執(zhí)行結(jié)果

可以看到兩個(gè)定時(shí)任務(wù)已經(jīng)分別由不同的線程執(zhí)行了

SpringBoot多線程執(zhí)行task任務(wù)

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI