SpringBoot添加定时任务入门请看这里=>SpringBoot入门八,添加定时任务java
Task定时任务默认都是使用单线程执行的,若是定时任务有不少的话,那么可能会致使不少任务没法按时准确执行,示例以下:spring
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); //输出时间格式 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("{} 向宇宙发出了一声问候: 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("{} 向宇宙发出了一声问候: 你好,世界", dateTime); } }
当sayHello()方法执行的时候,由于长时间占用任务执行线程,致使sayHello2()被迫向后延时执行,如图:多线程
添加如下代码块,可放置在任意一个类中,整个工程只须要添加一个便可ide
@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); // 设置scheduler执行线程为3个 scheduler.setPoolSize(3); return scheduler; }
添加一个配置类便可,定时任务类或方法不用作任何改变线程
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; /** * @描述: 多线程执行定时任务 * @日期 2019年5月28日 */ @Configuration public class TaskConfig { /** * @描述: 全部的定时任务都放在一个线程池中,定时任务启动时使用不一样的线程 * @return * @日期 2019年5月28日 */ @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); // 设置scheduler执行线程为3个 scheduler.setPoolSize(3); return scheduler; } }
添加一个配置类便可(实现SchedulingConfigurer接口),定时任务类或方法不用作任何改变code
import java.util.concurrent.Executors; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.SchedulingConfigurer; import org.springframework.scheduling.config.ScheduledTaskRegistrar; /** * @描述: 多线程执行定时任务 * @日期 2019年5月27日 */ @Configuration public class SchedulingConfig implements SchedulingConfigurer { /** * @描述: 全部的定时任务都放在一个线程池中,定时任务启动时使用不一样的线程 * @param taskRegistrar * @日期 2019年5月27日 */ @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { //设定一个定时任务线程池,数量为3 taskRegistrar.setScheduler(Executors.newScheduledThreadPool(3)); } }
能够看到两个定时任务已经分别由不一样的线程执行了orm