spring定时任务详解(@Scheduled注解)多线程讲解
(一)在xml里加入task的命名空间
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans classpath:/org/springframework/beans/factory/xml/spring-beans-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"> <task:annotation-driven /> </beans>
(二)启用注解驱动的定时任务
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans classpath:/org/springframework/beans/factory/xml/spring-beans-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"> <task:annotation-driven /> </beans>
(三)定时任务
Class : ATask
package com.xindatai.ibs.liang; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class ATask implements IATask { @Scheduled(cron="0/10 * * * * ?") public void aTask() { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } DateFormat df = new SimpleDateFormat("HH:mm:ss"); System.out.println(df.format(new Date()) + "********A任务每10秒执行一次进入测试"); } }
Class : BTask
package com.xindatai.ibs.liang; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class BTask implements IBTask { @Scheduled(cron="0/5 * * * * ?") public void bTask() { System.out.println(new SimpleDateFormat("HH:mm:ss").format(new Date()) + "********B任务每5秒执行一次进入测试"); } }
Console :
20:11:50********A任务每10秒执行一次进入测试 20:11:50********B任务每5秒执行一次进入测试 20:11:55********B任务每5秒执行一次进入测试 20:12:00********B任务每5秒执行一次进入测试 20:12:20********A任务每10秒执行一次进入测试 20:12:20********B任务每5秒执行一次进入测试 20:12:25********B任务每5秒执行一次进入测试 20:12:30********B任务每5秒执行一次进入测试 20:12:50********A任务每10秒执行一次进入测试 20:12:50********B任务每5秒执行一次进入测试 20:12:55********B任务每5秒执行一次进入测试 20:13:20********A任务每10秒执行一次进入测试 20:13:20********B任务每5秒执行一次进入测试 20:13:25********B任务每5秒执行一次进入测试 20:13:50********A任务每10秒执行一次进入测试 20:13:50********B任务每5秒执行一次进入测试 20:13:55********B任务每5秒执行一次进入测试 20:14:00********B任务每5秒执行一次进入测试 20:14:20********A任务每10秒执行一次进入测试 20:14:20********B任务每5秒执行一次进入测试 20:14:25********B任务每5秒执行一次进入测试 20:14:30********B任务每5秒执行一次进入测试 20:14:50********A任务每10秒执行一次进入测试 20:14:50********B任务每5秒执行一次进入测试 20:14:55********B任务每5秒执行一次进入测试 20:15:20********A任务每10秒执行一次进入测试 20:15:20********B任务每5秒执行一次进入测试 20:15:25********B任务每5秒执行一次进入测试 20:15:30********B任务每5秒执行一次进入测试 20:15:50********A任务每10秒执行一次进入测试 20:15:50********B任务每5秒执行一次进入测试 20:15:55********B任务每5秒执行一次进入测试 20:16:00********B任务每5秒执行一次进入测试 20:16:20********A任务每10秒执行一次进入测试 20:16:20********B任务每5秒执行一次进入测试 20:16:25********B任务每5秒执行一次进入测试 20:16:30********B任务每5秒执行一次进入测试 20:16:50********A任务每10秒执行一次进入测试 20:16:50********B任务每5秒执行一次进入测试 20:16:55********B任务每5秒执行一次进入测试 20:17:20********A任务每10秒执行一次进入测试 20:17:20********B任务每5秒执行一次进入测试 20:17:25********B任务每5秒执行一次进入测试 20:17:30********B任务每5秒执行一次进入测试 20:17:50********A任务每10秒执行一次进入测试 20:17:50********B任务每5秒执行一次进入测试 20:17:55********B任务每5秒执行一次进入测试 20:18:20********A任务每10秒执行一次进入测试 20:18:20********B任务每5秒执行一次进入测试 20:18:25********B任务每5秒执行一次进入测试 20:18:50********A任务每10秒执行一次进入测试 20:18:50********B任务每5秒执行一次进入测试 20:18:55********B任务每5秒执行一次进入测试 20:19:00********B任务每5秒执行一次进入测试 20:19:20********A任务每10秒执行一次进入测试 20:19:20********B任务每5秒执行一次进入测试 20:19:25********B任务每5秒执行一次进入测试 20:19:30********B任务每5秒执行一次进入测试 20:19:50********A任务每10秒执行一次进入测试 20:19:50********B任务每5秒执行一次进入测试 20:19:55********B任务每5秒执行一次进入测试 20:20:20********A任务每10秒执行一次进入测试 20:20:20********B任务每5秒执行一次进入测试 20:20:25********B任务每5秒执行一次进入测试 20:20:50********A任务每10秒执行一次进入测试 20:20:50********B任务每5秒执行一次进入测试 20:20:55********B任务每5秒执行一次进入测试 20:21:00********B任务每5秒执行一次进入测试 20:21:20********A任务每10秒执行一次进入测试 20:21:20********B任务每5秒执行一次进入测试 20:21:25********B任务每5秒执行一次进入测试 20:21:50********A任务每10秒执行一次进入测试 20:21:50********B任务每5秒执行一次进入测试 20:21:55********B任务每5秒执行一次进入测试 20:22:20********A任务每10秒执行一次进入测试 20:22:20********B任务每5秒执行一次进入测试 20:22:25********B任务每5秒执行一次进入测试 20:22:30********B任务每5秒执行一次进入测试 20:22:50********A任务每10秒执行一次进入测试 20:22:50********B任务每5秒执行一次进入测试 20:22:55********B任务每5秒执行一次进入测试 20:23:00********B任务每5秒执行一次进入测试 20:23:20********A任务每10秒执行一次进入测试 20:23:20********B任务每5秒执行一次进入测试 20:23:25********B任务每5秒执行一次进入测试
spring的定时任务默认是单线程,多个任务执行起来时间会有问题:B任务会因为A任务执行起来需要20S而被延后20S执行
(一)在xml里加入task的命名空间
(二)启用注解驱动的定时任务
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/beans classpath:/org/springframework/beans/factory/xml/spring-beans-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd"> <!-- 启用annotation方式 --> <task:annotation-driven scheduler="myScheduler" /> <!-- 配置任务线程池 --> <task:scheduler id="myScheduler" pool-size="5" /> </beans>
Console :
啦啦啦
啦啦啦
啦啦啦
啦啦啦
package com.xindatai.ibs.liang;
import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;
@Componentpublic class ATask implements IATask {
@Scheduled(cron="0/10 * * * * ?")public void aTask() {try {Thread.sleep(20000);} catch (InterruptedException e) {e.printStackTrace();}DateFormat df = new SimpleDateFormat("HH:mm:ss");System.out.println(df.format(new Date()) + "********A任务每10秒执行一次进入测试");}
}