1.第一种@EnableScheduling 注解
定时执行
package com.neo;
import java.io.File;
import org.apache.log4j.PropertyConfigurator;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.web.servlet.ErrorPage;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.EnableScheduling;
import com.neo.utils.PathUtils;
@SpringBootApplication
@EnableScheduling //添加定时任务
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
/**
* @author lcc
* @time 2018-06-17
* @desc 定时任务
*/
@Component
public class TimeTask {
/* cron表达式中各时间元素使用空格进行分割,分别表示如下含义:
按顺序依次为
秒(0~59)
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
7.年份(1970-2099)*/
//每天中午12点触发 去删除数据库中已经删除的留言信息
@Scheduled(cron="5/10 * * * * ?")
public void onApplicationEvent() {
RoadShowTask RoadShowTask = new RoadShowTask("aa");
RoadShowTask.start();
System.out.println("aa");
}
}
public class RoadShowTask extends Thread{
static Logger logger= LoggerFactory.getLogger(RoadShowTask.class);
private String name;
public RoadShowTask(String name) {
this.name=name;
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + "运行 : " + i + " 线程池 ==>"+Thread.currentThread().getName().toString()+" ==> "+Thread.currentThread().toString());
try {
sleep((int) Math.random() * 10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Thread.currentThread().interrupt();
}
}
执行结果
aa
aa运行 : 0 线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行 : 1 线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行 : 2 线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行 : 3 线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa运行 : 4 线程池 ==>Thread-6 ==> Thread[Thread-6,5,main]
aa
aa运行 : 0 线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行 : 1 线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行 : 2 线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行 : 3 线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa运行 : 4 线程池 ==>Thread-7 ==> Thread[Thread-7,5,main]
aa
aa运行 : 0 线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行 : 1 线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行 : 2 线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行 : 3 线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
aa运行 : 4 线程池 ==>Thread-8 ==> Thread[Thread-8,5,main]
这种每次new一个线程,感觉太low
/**
* @author lcc
* @time 2018-06-17
* @desc 定时任务
*/
@Component
public class TimeTask {
private static ExecutorService executors = Executors.newFixedThreadPool(2, ThreadFactoryUtil.newFactory("Roadshow_Listener_"));
@Scheduled(cron="5/10 * * * * ?")
public void onApplicationEvent() {
RoadShowTask RoadShowTask = new RoadShowTask("aa");
executors.submit(RoadShowTask);
// RoadShowTask RoadShowTask = new RoadShowTask("aa");
// RoadShowTask.start();
System.out.println("aa");
}
}
修改上面的代码,改成线程池运行,这种相当于executors生成了2个线程,但是没有任务,而executors.submit(RoadShowTask);
相当于把new的线程放到线程池里运行。
结果
aa
aa运行 : 0 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 1 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 2 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 3 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 4 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa
aa运行 : 0 线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行 : 1 线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行 : 2 线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行 : 3 线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa运行 : 4 线程池 ==>Roadshow_Listener_2 ==> Thread[Roadshow_Listener_2,5,main]
aa
aa运行 : 0 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 1 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 2 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 3 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
aa运行 : 4 线程池 ==>Roadshow_Listener_1 ==> Thread[Roadshow_Listener_1,5,main]
2.集继承ApplicationListener
spring 项目加载完立刻执行
@SpringBootApplication
@EnableScheduling //添加定时任务
public class ManagerApplication {
public static void main(String[] args) {
ConfigurableApplicationContext ctx = null;
try {
long start = System.currentTimeMillis();
SpringApplication sa = new SpringApplication(ManagerApplication.class);
// 注册监听器 定时任务 这里还必须new放到里面
sa.addListeners(new RoadShowStatusListener());
ctx = sa.run(args);
} catch (Exception e) {
LOGGER.error("Application start error:", e);
System.exit(-1);
} finally {
if (ctx != null) {
ctx.close();
}
}
}
}
public class RoadShowStatusListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.print("aa");
}