java单线程跑任务_springboot默认单线程排队跑定时任务问题记录

** 问题描述:在使用springboot默认的定时任务时,若存在多个任务,框架默认只启动一个线程执行,会导致有些任务不能在指定时间开始执行**

** 另,关于分布式下定时任务同步锁问题,会再单独写一篇记录**

测试默认情况下定时任务的线程名称:

package com.example.demo.job;

import net.javacrumbs.shedlock.core.SchedulerLock;

import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component

@EnableScheduling

public class TestJob {

@Scheduled(cron = "0/5 * * * * ?")

@SchedulerLock(name = "test1-task", lockAtMostForString = "PT28M", lockAtLeastForString = "PT28M")

public void execute1() {

String curName = Thread.currentThread().getName();

System.out.println("当前时间:" + LocalDateTime.now() + " 任务execute1对应的线程名: " + curName);

try {

Thread.sleep(1000);

} catch (Exception e) {

e.printStackTrace();

}

}

@Scheduled(cron = "0/5 * * * * ?")

@SchedulerLock(name = "test2-task", lockAtMostForString = "PT28M", lockAtLeastForString = "PT28M")

public void execute2() {

String curName = Thread.currentThread().getName();

System.out.println("当前时间:" + LocalDateTime.now() + " 任务execute2对应的线程名: " + curName);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

@Scheduled(cron = "0/10 * * * * ?")

@SchedulerLock(name = "test3-task", lockAtMostForString = "PT28M", lockAtLeastForString = "PT28M")

public void execute3() {

String curName = Thread.currentThread().getName();

System.out.println("当前时间:" + LocalDateTime.now() + " 任务execute3对应的线程名: " + curName);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

结果如下:

dbc106584dcd6a44abc8a75e8cf07d56.png

spring boot 自带的定时任务默认只起一个线程:

ceef1759717cbbdcd39a5ec68fba3273.png

这种情况下,对于有些定时任务若设定在某一固定时刻开始执行,就可能出现需要排队而不能准时执行的情况。然后找了下解决方案,我不太想巴拉源码了,网上大家都扒出来了,就是为空初始化一个线程那段,直接点上解决方案:

在启动类里面加上如下代码:

/**

* 解决定时任务单线程排队问题,建立线程池

* @return

*/

@Bean

public TaskScheduler taskScheduler() {

ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();

taskScheduler.initialize();

taskScheduler.setPoolSize(50);

return taskScheduler;

}

然后重新启动看下线程的情况:

2f67edcadfbf7c5d0582e0346bb26b94.png

以及核心线程数:

2942bce38d7050dae929edacf9be72ae.png

这样就解决了单线程问题。

另:分布式情况下只能有一个定时任务在执行,防止重复执行的方案有很多,下次再写。

文章来源: www.oschina.net,作者:小小明童鞋,版权归原作者所有,如需转载,请联系作者。

原文链接:https://my.oschina.net/xiaomingnevermind/blog/3143095

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值